我遇到了mouseExited和mouseEntered事件。它们没有执行。我知道是因为setLayout
。如果我发表评论,问题就消失了。这是我的代码:
public class Test{
public static void main(String[] args) {
new Test();
}
public Test() {
JFrame frame = new JFrame();
frame.setContentPane(new Pane());
frame.getContentPane().setBackground(Color.GRAY);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public class Pane extends JPanel{
public Pane(){
ImageIcon start = new ImageIcon("Start.png");
JLabel bStart = new JLabel(start);
ImageIcon exit = new ImageIcon("Exit.png");
JLabel bExit = new JLabel(exit);
setLayout(new BorderLayout());
add(bStart, BorderLayout.CENTER);
bStart.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
ImageIcon image = new ImageIcon("Start-Pressed.png");
bStart.setIcon(image);
Container parent = bStart.getParent();
parent.remove(bStart);
add(bExit);
parent.revalidate();
parent.repaint();
}
public void mouseEntered(MouseEvent arg0) {
ImageIcon image = new ImageIcon("Start-Hover.png");
bStart.setIcon(image);
}
public void mouseExited(MouseEvent arg0) {
ImageIcon image = new ImageIcon("Start.png");
bStart.setIcon(image);
}
});
bExit.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
System.exit(0);
}
public void mouseEntered(MouseEvent e){
ImageIcon image = new ImageIcon("Exit-Hover.png");
bExit.setIcon(image);
}
public void mouseExited(MouseEvent e){
ImageIcon image = new ImageIcon("Exit.png");
bExit.setIcon(image);
}
});
}
}
}
最佳答案
我知道这是因为setLayout。如果我发表评论,这个问题就会消失。
我怀疑布局是问题所在。如果出现该组件,则布局管理器与MouseEvent的生成方式无关。
从您看来,代码似乎正在尝试提供过渡效果。除了为此使用JLabel之外,还可以使用JButton
并为不同的翻转效果设置图标:
button.setBorderPainted( false );
button.setRolloverEnabled( true );
button.setRolloverIcon( ... );
button.setRolloverSelectedIcon(...);
button.setSelectedIcon(...);
然后,无需管理MouseListener,因为UI会为您完成。
要处理mousePressed,您应该在JButton上使用
ActionListener
。阅读有关How to Write an ActionListener的Swing教程中的部分,以获取更多信息。