JButton() only working when mouse hovers
Solution 1:
add Icon/ImageIcon directly to the JButton instead of paint()
for AWT or paintComponent()
for Swing JComponents
Contructor JButton(Icon) knows Icon or ImageIcon
from code
import java.awt.*;
import javax.swing.*;
public class ButtonsIcon extends JFrame {
private static final long serialVersionUID = 1L;
private ImageIcon errorIcon = (ImageIcon) UIManager.getIcon("OptionPane.errorIcon");
private Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon");
private Icon warnIcon = UIManager.getIcon("OptionPane.warningIcon");
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ButtonsIcon t = new ButtonsIcon();
}
});
}
public ButtonsIcon() {
setLayout(new GridLayout(0, 2, 4, 4));
JButton button = new JButton();
button.setBorderPainted(false);
button.setBorder(null);
button.setFocusable(false);
button.setMargin(new Insets(0, 0, 0, 0));
button.setContentAreaFilled(false);
button.setIcon((errorIcon));
button.setRolloverIcon((infoIcon));
button.setPressedIcon(warnIcon);
button.setDisabledIcon(warnIcon);
add(button);
JButton button1 = new JButton();
button1.setBorderPainted(false);
button1.setBorder(null);
button1.setFocusable(false);
button1.setMargin(new Insets(0, 0, 0, 0));
button1.setContentAreaFilled(false);
button1.setIcon((errorIcon));
button1.setRolloverIcon((infoIcon));
button1.setPressedIcon(warnIcon);
button1.setDisabledIcon(warnIcon);
add(button1);
button1.setEnabled(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
}
Solution 2:
Likely you have a layout problem where you're trying to add JButtons with absolute bounds into a container that uses a non-null layout manager. Suggestions
- Do not use setBounds and absolute positioning to size and place your components.
- Read up on and use the layout managers to do this heavy lifting for you: Lesson: Laying Out Components Within a Container
- Don't forget to call
pack()
on your JFrame after adding all components - Call
setVisible(true)
after callingpack()
and again call both only after adding all components to your GUI. - A null layout is available if you absolutely need to use absolute positioning of components, but regardless, you should strive to avoid using it.
Solution 3:
It looks like you're never repainting after you add your buttons.
I would add a repaint in there after you add them.