我在 mouseExited 事件中遇到了一些麻烦。我有一个带有鼠标监听器的未经修饰的JDialog,这个JDialog比一个禁用的JFrame多一半。当鼠标退出对话框并转到桌面上时,将触发 mouseExited 事件,但如果鼠标退出对话框并越过禁用的帧,则不会触发该事件。仅当帧被禁用时,才会发生这种情况。我不知道为什么..有人可以帮助我吗?
下面是一个快速示例:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class MouseListenerTest {
public static void main(String a[]) {
System.out.println("java.version: " + System.getProperty("java.version"));
JFrame ownerFrame = new JFrame("Hello i am the owner frame :)");
ownerFrame.setBounds(100,100,500,500);
ownerFrame.setVisible(true);
ownerFrame.setEnabled(false);
JDialog topDialog = new JDialog(ownerFrame, "Hello i am the top dialog");
topDialog.getContentPane().setBackground(Color.YELLOW);
topDialog.setUndecorated(true);
final JLabel xLabel = new JLabel("I am OUT");
xLabel.setHorizontalAlignment(JLabel.CENTER);
topDialog.getContentPane().add(xLabel, BorderLayout.CENTER);
topDialog.addMouseListener(new MouseAdapter(){
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("I am IN");
xLabel.setText("I am IN");
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("I am OUT");
xLabel.setText("I am OUT");
}});
topDialog.setBounds(500,200,200,200);
topDialog.setVisible(true);
}
}
Component#setEnabled(boolean( (Java Platform SE 8 (
注意:禁用重量级容器可防止此容器中的所有组件接收任何输入事件。但禁用轻量级容器仅影响此容器。
JFrame
是一个重量级(顶级(组件,所以我认为这种行为是规范。