【问题标题】:JDialog Mouse Listener called as not expected未按预期调用 JDialog 鼠标侦听器
【发布时间】:2012-07-18 12:30:19
【问题描述】:

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

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

【问题讨论】:

标签: java swing desktop-application


【解决方案1】:

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

让我们从 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");

   }

}

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

【讨论】:

  • += 4-= 4 是什么?
  • te +/- 4 的目的只是一个误差范围(需要测试和重新发现)。如果鼠标移动得足够快,您可能无法完全获得组件的确切边缘,而是最后记录的位置
  • 感谢 M 程序员。你处理它的方式是我目前解决它的方法。我一直在寻找另一个更好的听众。听起来,没有这样的听众来帮忙:(。再次感谢你。
  • 没问题,我能感觉到你的痛苦
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 2013-11-27
  • 2012-01-21
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多