我遇到了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教程中的部分,以获取更多信息。

10-05 19:39