JDialog Mouse Listener被称为不期望的

时间:2012-07-19 10:28:09

标签: 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中,鼠标退出时也会调用此侦听器。我希望在完全退出鼠标时调用侦听器,而当鼠标移动到其本身的子组件时不调用。我该如何解决这个问题?

1 个答案:

答案 0 :(得分: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");

   }

}

这当然可能需要进行一些调整才能做到正确。