1

在我的 Swing 应用程序中,我使用了 JDialog 并将 JPanel 添加到 JDialog。我希望在鼠标退出 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 中,也会在鼠标退出时调用此侦听器。我想在鼠标完全退出时调用侦听器,而不是在鼠标转到其本身的子组件时调用。我该如何解决这个问题?

4

1 回答 1

2

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

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

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

现在,通知系统可以让您知道鼠标何时进入并存在您的影响域。

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

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");

   }

}

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

于 2012-07-19T19:50:48.907 回答