MouseEntered和MouseExited无法正常工作

时间:2015-01-31 15:10:02

标签: java swing mouseevent jbutton mouselistener

我遇到了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);
                  }
             }); 
        }    
    } 
}

1 个答案:

答案 0 :(得分:2)

  

我知道这是因为setLayout。如果我评论它,问题就会消失。

我怀疑布局是个问题。如果组件出现,则布局管理器与MouseEvents的生成方式无关。

从您的代码看起来就像您正在尝试提供翻转效果。您可以使用JButton并为不同的翻转效果设置图标,而不是使用JLabel:

button.setBorderPainted( false );
button.setRolloverEnabled( true );
button.setRolloverIcon( ... );
button.setRolloverSelectedIcon(...);
button.setSelectedIcon(...);

然后就不需要管理MouseListener,因为UI会为你做这件事。

要处理mousePressed,您应该在JButton上使用ActionListener。有关详细信息,请阅读How to Write an ActionListener上的Swing教程中的部分。