To nie jest błąd. Po prostu podczas kliknięcia taki kolor (rgb 184, 207, 229) domyślnie przyjmuje tło JButton'a z uwagi m.in. na posiadany "focus", ale też po prostu na to, jak jest zaimplementowany DefaultButtonModel
. Niestety użycie JButton.setFocusable(false)
pod inicjalizacją obiektu nie ratuje nas z beznadziejnej sytuacji. Można by pomyśleć o nadpisaniu metody interfejsu MouseAdapter
dla metody JButton'a addMouseListener
, tj. metody mousePressed
, i zawarciu tutaj JButton.setFocusable(false)
:
Kopiuj
JButton.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
JButton.setFocusable(false);
JButton.setBackground(new Color(255, 243, 0));
}
}
...ale niestety działa to jedynie przy pierwszym kliknięciu (przynajmniej u mnie). Czy więc się nie da? Da. Paradoksalnie wykorzystując we właściwy sposób model dla JButtona. Mianowicie musimy rozszerzyć klasę DefaultButtonModel
i nadpisać metodę isPressed()
:
Kopiuj
public class CoolButtonModel extends DefaultButtonModel {
@Override
public boolean isPressed() {
return false;
}
}
Teraz tworzymy już klasę testową i sprawdzamy nasze rozwiązanie:
Kopiuj
public class Test extends JFrame {
public Test() {
init();
}
private void init() {
setTitle("Button example");
setSize(300, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JButton button = new JButton("Test");
button.setModel(new CoolButtonModel());
button.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
button.setBackground(new Color(255, 243, 0));
}
@Override
public void mouseReleased(MouseEvent e) {
button.setBackground(new Color(255, 64, 0));
}
@Override
public void mouseEntered(MouseEvent e) {
button.setBackground(new Color(166, 166, 166));
}
@Override
public void mouseExited(MouseEvent e) {
button.setBackground(null);
}
});
add(button);
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
Test window = new Test();
window.setVisible(true);
});
}
}
No i wszystko działa jak należy. Teraz, gdy będziesz najeżdżał kursorem na przycisk lub tym kursorem uciekał poza pole przycisku, przycisk będzie zmieniał kolor. Zmieni kolor również wtedy, gdy naciśniesz przycisk myszy, a także zmieni kolor, gdy ten przycisk puścisz.
Oczywiście, to nie jest jedyne rozwiązanie problemu.