Я ничего не нашел, что может изменить это конкретное поведение на обычном JButton. Проблема заключается в том, что все, что вы пишете в своем actionlistener для кнопки, произойдет после того, как вы отпустите кнопку мыши, а не «при нажатии».
Однако есть обходные пути.
Мой предпочтительный выбор - удалить всю графику с кнопки, а затем добавить свои собственные изображения в обычные и нажатые состояния кнопки. Вы можете сделать снимок экрана своего графического интерфейса, вырезать кнопку и установить для этого изображения оба состояния.
JButton myButton = new JButton();
// Sets button x, y, width, height. Make the size match the image.
myButton.setBounds(5, 30, 100, 30);
// Remove border-graphics.
myButton.setBorder(null);
// Remove default graphics from the button
myButton.setContentAreaFilled(false);
// Remove the focus-indicating dotted square when focused (optional)
myButton.setFocusPainted(false);
// Here, myImage is a simple BufferedImage object.
// You can set one like this, provided you have an "images" package,
// next to your main class (ex: com.somecompany.someprogram.images),
// that contains an image:
BufferedImage myImage = ImageIO.read(getClass().getResource("images/myImage.png"));
// Then we simply apply our image to both states for the button, and we're done.
myButton.setIcon(new ImageIcon(myImage));
myButton.setPressedIcon(new ImageIcon(myImage));
Очевидно, что существует много способов, чтобы сохранить и загрузить изображение, но так как это не проблема, я оставляю дополнительные методы выхода из него.
Нет необходимости проходить через все это бесчисленное количество раз. Должно быть довольно легко написать собственную собственную реализацию класса JButton, в которой пользовательский конструктор принимает один параметр, являющийся BufferedImage, а затем конструктор устанавливает его соответствующим образом (меняет значки). Тогда все, что вам нужно сделать, когда вы создаете новый JButton, чтобы использовать свой собственный класс, и передать его изображение:
JButton btn = new MyCustomJButton(myImage);
Вы также можете легко получить вместе с очень мало изображений. Все, что вам нужно, это HashMap, который содержит все изображения, с строкой в качестве ключа. Представьте, что вам нужно 4 OK-кнопки. Вы делаете одно изображение кнопки с текстом «ОК», написанным на нем. Затем вы кладете этот образ в HashMap, например, так:
myMap.put("OK", myImage);
Тогда вы могли бы сделать это при создании кнопки, снова и снова, если вы хотите больше:
JButton btn = new MyCustomJButton(myMap.get("OK"));
В качестве альтернативы: Другим способом достижения этого, который довольно сложный, но, вероятно, считается «правильным путем», является использование ButtonUI, как представлено в this answer to another post.
Это простое и хорошее решение, которое я искал. – Anak1n