在我的 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/