java - JDialog 鼠标监听器按预期调用

标签 java swing desktop-application

在我的 swing 应用程序中,我使用了 JDialog 并向 JDialog 添加了 JPanel。我希望当鼠标退出 JDialog 时调用 JDialog 的鼠标监听器。我是这样做的。

myJDialog.addMouseListener(new java.awt.event.MouseAdapter() {  
    public void mouseExited(java.awt.event.MouseEvent evt) {  
        System.out.println("Mouse has exited the Dialog");  
    }  
});

实际上它是在鼠标退出时调用的,但是当鼠标进入添加到 JDialog 的 Jpanel 中的 JTextField 时,即使鼠标仍在 JDialog 内,也会在鼠标退出时调用此监听器。我希望在鼠标完全退出时调用监听器,而不是在鼠标转到其本身的子组件时调用监听器。我该如何解决这个问题?

最佳答案

这不是一个容易回答的问题。

让我们从 mouseListener 开始。尝试将您的容器(在本例中为对话框)视为一个 3D 计划,在该计划之上,我们添加组件。每个组件都存在于容器上方的一层或多层上(转换出漂亮的阴影)。

现在,将鼠标视为向下指向该计划顶部的激光。只要激光可以到达您的容器,您就会收到有关鼠标事件的通知。但是,如果移动鼠标导致另一个组件阻挡它(激光无法再到达您的组件),您将停止接收通知,因为事件被阻挡。

现在,通知系统足够友善,可以让您知道鼠标何时进入并存在您的影响范围。

这就是系统的工作原理。除了使用全局事件处理程序(它至少会让您知道鼠标上下文已移动到哪里)之外,我能想到的唯一“其他”解决方案是检查鼠标退出事件的坐标并根据您的内容检查它们 Pane 的边界。

public void mouseExit(MouseEvent evt) {
    Point p = evt.getPoint();
    Rectangle bounds = getBounds();

    bounds.x += 4;
    bounds.y += 4;
    bounds.width -= 4;
    bounds.height -= 4;

   if ((p.x < bounds.x || p.x > bounds.x + bounds.width) && (p.y < bounds.y || p.y > bounds.y + bounds.height) {

       System.out.println("Elvis has left the building");

   }

}

这当然可能需要一些调整才能恰到好处。

关于java - JDialog 鼠标监听器按预期调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11558865/

相关文章:

swift - 有没有一种方法可以有 float 区域,这样我们就可以在 Xcode 的多个屏幕上工作?

html - Electron <webview> 没有全屏显示?

java 8,CompletableFuture

java - 把一个JScrollPane滚动条的bar放在XXX处,不用 "flashing"

java - 如何在不同的方法上使用变量集?

java - 如何将 MouseListener 添加到 GridLayout 中的每个单独元素?

python - 从 PyQt5 中的 QListWidget 中删除项目

java - spring boot web绑定(bind)时如何拦截错误信息?

java - 为什么带有可变参数的 Java 方法被识别为 transient ?

java - 在Java中用不同的名称重命名多个文件夹