我将鼠标监听器添加到2个不同的面板中,一个放在另一个面板上时遇到问题。它们都使用mouseEntered()mouseExited()方法。

下面的测试代码的预期结果是:

  • 当我将鼠标悬停在框架上时,应使红色矩形可见
  • 当我将鼠标悬停在框架中的红色矩形上时,它应该变成蓝色
  • 当我的鼠标退出现在的蓝色矩形(但仍在框架内)时,它应该变成红色
  • 当我的鼠标完全退出框架时,现在不可见的红色矩形

  • 如果我尝试将鼠标移到彩色矩形上,它将保持从可见到不可见的闪烁状态。系统打印显示了我的意思,每次我移动或单击鼠标时,它都会不断激活“Mouse Entered”和“Mouse Exited”。是否有防止每次我移动或单击鼠标时调用mouseExited()方法的方法?

    这是测试代码:
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class Sandbox extends JPanel {
    
        public static void main(String[] args) {
            JFrame frame = new JFrame();
            frame.setSize(500, 500);
            frame.add(new Sandbox());
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
    
        }
    
        public Sandbox() {
            super(new BorderLayout());
    
            final JPanel panelA = new JPanel();
            panelA.setBackground(Color.red);
            panelA.setPreferredSize(new Dimension(155, 155));
            panelA.setVisible(false);
    
            this.add(panelA, BorderLayout.WEST);
    
            this.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseEntered(MouseEvent e) {
    
                    System.out.println(" -  MOUSE ENTERED ");
                    panelA.setVisible(true);
                }
    
                @Override
                public void mouseExited(MouseEvent e) {
    
                    System.out.println(" -  MOUSE EXITED ");
                    panelA.setVisible(false);
                }
    
            });
    
            panelA.addMouseListener(new MouseAdapter() {
    
                @Override
                public void mouseEntered(MouseEvent e) {
    
                    System.out.println(" #  MOUSE ENTERED ");
                    panelA.setBackground(Color.blue);
    
                }
    
                @Override
                public void mouseExited(MouseEvent e) {
                    panelA.setBackground(Color.red);
                    System.out.println(" #  MOUSE EXITED ");
                }
    
            });
    
        }
    
    }
    

    最佳答案

    您有该行为,因为您有2个监听器。当您尝试将颜色更改为blue时,它发生了变化,但是从第一个监听器开始执行panelA.setVisible(false);,您看不到它。

    您可以通过以下方式解决此问题:在第一个监听器中更改mouseExited()方法的代码:

       @Override
       public void mouseExited(MouseEvent e) {
            if(!panelA.contains(e.getPoint())){
                 panelA.setVisible(false);
            }
            System.out.println(" -  MOUSE EXITED ");
       }
    

    编辑:将鼠标移到panelA上时从帧退出的另一种解决方法:更改第二个监听器的mouseExited:
     @Override
     public void mouseExited(MouseEvent e) {
        panelA.setBackground(Color.red);
            if (!Sandbox.this.contains(e.getPoint())) {
                panelA.setVisible(false);
            }
    
            System.out.println(" #  MOUSE EXITED ");
      }
    

    关于java - 多个 Pane ,彼此之间具有MouseListener,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20682526/

    10-11 17:11