【问题标题】:MouseListener on JFrameJFrame 上的 MouseListener
【发布时间】:2009-09-10 22:35:40
【问题描述】:

我希望在我的 JFrame 上收到有关鼠标事件(特别是鼠标进入和退出事件)的通知。但是当我向它添加鼠标侦听器时,我会在框架的边界上获得事件,而不是在整个框架及其内容。

有什么想法吗?

编辑:或者至少你有其他选择吗?我想要一种“全局”方式来捕捉 JFrame 上的鼠标事件。也许鼠标监听器不是答案。

【问题讨论】:

    标签: java swing events mouseevent jframe


    【解决方案1】:

    您可以获取所有事件并检查其来源是否为 JFrame 中的组件。

    Toolkit.addAWTEventListener

    【讨论】:

      【解决方案2】:

      有一个不可见的组件覆盖整个 GUI,即“玻璃窗格”。你可以把你的听众附加到那个上面。示例:

      JFrame frame = new JFrame();
      Component glassPane = frame.getGlassPane();
      glassPane.addMouseListener(myListener);
      

      如果您希望拦截的事件传递到底层组件,您可以重新调度它们。例如:

      public void mouseMoved(MouseEvent e) {
          redispatchMouseEvent(e, false);
      }
      

      【讨论】:

      • 我必须启用它。这将阻止下面的组件接收事件
      • 您可以重新派送。请参阅我修改后的答案。
      • 启用玻璃窗格时存在整个问题。它在肮脏的富客户中得到了最好的描述。您需要预见所有问题并加以纠正。例如,您还需要考虑按键事件、鼠标光标变化等。我正在寻找现成的解决方案。旨在通知帧级别的鼠标事件的东西。
      • 我必须同意@Sawas,唉。我在codeidol.com/java/swing/Rendering/Create-a-Global-Right-Click 中实现了代码(与您展示的类似),但虽然它工作得很好,但我遇到了底层 L&F 组件的问题,例如拆分条(没有光标更改,并且在速度过快时绘图失败)和滚动条按钮(没有滚动条移动)。
      【解决方案3】:

      因为内容(可能是 JPanel)正在“隐藏”并消耗事件,并​​且它们不会到达 JFrame。

      您可以做的是为所有孩子添加相同的侦听器。不过应该有更好的方法。

      【讨论】:

        【解决方案4】:

        AWTEventListener 的替代方法是推送EventQueue。这样做的好处是小程序和 WebStart 应用程序可以做到这一点。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-29
          • 2013-04-09
          • 1970-01-01
          • 2020-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多