多个窗格与MouseListener相互叠加

时间:2013-12-19 13:03:33

标签: java swing mouselistener

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

测试代码的预期结果如下:

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

如果我尝试将鼠标移到彩色矩形上,它会一直闪烁,从可见到不可见。系统打印显示我的意思,它每次移动或用鼠标点击时都会一直激活鼠标输入和鼠标退出。反正是否有阻止每次移动或点击鼠标时调用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 ");
            }

        });

    }

}

1 个答案:

答案 0 :(得分:2)

你有这种行为,因为你有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 ");
  }