我有一个问题,鼠标监听器一个在另一个上面添加到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 ");
}
});
}
}
答案 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 ");
}