java - MouseListener 事件 MouseExited 不适用于禁用框架上的未修饰对话框

标签 java swing jframe mouselistener jdialog

我在 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);
    }
}

最佳答案

Component#setEnabled(boolean) (Java Platform SE 8 )
Note: Disabling a heavyweight container prevents all components in this container from receiving any input events. But disabling a lightweight container affects only this container.

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

关于java - MouseListener 事件 MouseExited 不适用于禁用框架上的未修饰对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48158659/

相关文章:

java - TCP Socket 通信 Java - Python

Java KeyStore 重复别名

java - 是否可以将按键或组件事件发送到第 3 方 swing 应用程序

java - EventDispatchThread.java 处发生异常断点

java - 实现 JScrollPane 以滚动 JLabels 和 JButton 列表

java - 如何获取单独的子节点值

java - 在子类和父类(super class)中具有相同的变量

java - 为什么我的 JAVA GUI 打开多个窗口?

java - 按下 JButton 后多次生成 JPanel "blink"

java - 具有多个框架的 GUI