代码之家  ›  专栏  ›  技术社区  ›  Débora

JDialog鼠标侦听器未按预期调用

  •  1
  • Débora  · 技术社区  · 14 年前

    在我的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 回复  |  直到 11 年前
        1
  •  2
  •   MadProgrammer    14 年前

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

    让我们从mouseListener开始。试着把你的容器(在这种情况下是对话框)想象成一个三维平面图,在这个平面图的顶部,我们添加了组件。每个组件都存在于容器上方的一个或多个层上(投射出一个漂亮的阴影)。

    现在,把鼠标想象成一个激光指向计划的顶部。只要激光能够到达您的容器,您就会收到有关鼠标事件的通知。但是,如果移动鼠标使另一个组件挡住它(激光无法再到达您的组件),您将停止接收通知,因为事件被挡住了。

    现在,通知系统足够善良,可以让你知道鼠标何时进入和存在你的影响域。

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

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

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