So I want to put a button in a JPanel, but I want to keep it invisible/hidden unless the mouse pointer hovers over it. At this point, the button should be made visible, react to clicks and so on. When the mouse leaves the area, it should be hidden again.
I tried adding a MouseListener to my JButton and use setVisible(), but when I hide the button (setVisible(false)), then the listener doesn't work anymore - the application behaves as if the button is not there at all.
What's the correct way to implement this behavior?
Edit: I am using an absolute layout (setLayout(null)) and I am manually placing my component using setBounds(x, y, width, height).
解决方案
Use icons to reveal (colored) or hide (transparent) the button respectively.
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
class InvisiButton {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
int size = 30;
JPanel gui = new JPanel(new GridLayout(4,10,4,4));
for (int ii=0; ii<40; ii++) {
JButton b = new JButton();
b.setContentAreaFilled(false);
b.setIcon(new ImageIcon(
new BufferedImage(size,size,BufferedImage.TYPE_INT_RGB)));
b.setRolloverIcon(new ImageIcon(
new BufferedImage(size,size,BufferedImage.TYPE_INT_ARGB)));
b.setBorder(null);
gui.add(b);
}
JOptionPane.showMessageDialog(null, gui);
}
};
// Swing GUIs should be created and updated on the EDT
// http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
SwingUtilities.invokeLater(r);
}
}