Sam*_*chi 5 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 ");
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
你有这种行为,因为你有两个听众。当您尝试更改颜色时blue
,它会发生变化,但是从执行的第一个侦听器开始panelA.setVisible(false);
,您就看不到这一点。
您可以通过以下方式修复该问题:更改mouseExited()
第一个侦听器中方法的代码:
@Override
public void mouseExited(MouseEvent e) {
if(!panelA.contains(e.getPoint())){
panelA.setVisible(false);
}
System.out.println(" - MOUSE EXITED ");
}
Run Code Online (Sandbox Code Playgroud)
编辑:鼠标悬停时退出框架的另一个修复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 ");
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
747 次 |
最近记录: |