MouseListener事件MouseExited对禁用帧上的未修饰对话框不起作用

Ap0*_*p0k 5 java swing jframe jdialog mouselistener

我在mouseExited事件上遇到了一些麻烦.我有一个带有MouseListener的未修饰的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

ate*_*rai 1

Component#setEnabled(boolean) (Java Platform SE 8 )
注意:禁用重量级容器会阻止该容器中的所有组件接收任何输入事件。但禁用轻量级容器仅影响该容器。

JFrame是一个重量级(顶级)组件,所以我认为这种行为是规范。