我将鼠标监听器添加到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/