繁体   English   中英

如何捕获JFrame / Swing中的所有鼠标事件?

[英]How can I capture all mouse events in a JFrame/Swing?

我有一个JFrame,它有大量更改的子组件。 (很多层)有没有办法为所有鼠标事件添加一个监听器? 像KeyEventDispatcher这样的东西?

使用AWTEventListener过滤掉MouseEvents:

long eventMask = AWTEvent.MOUSE_MOTION_EVENT_MASK + AWTEvent.MOUSE_EVENT_MASK;
Toolkit.getDefaultToolkit().addAWTEventListener( new AWTEventListener()
{
    public void eventDispatched(AWTEvent e)
    {
        System.out.println(e);
    }
}, eventMask);

您可以在整个JFrame上添加GlassPane ,向其添加MouseInputAdapter以获取所有可能的鼠标事件,然后使用[SwingUtilities.getDeepestComponentAt()] [3]获取实际组件和[SwingUtilities.convertMouseEvent()] [4 ]将鼠标事件从玻璃窗格委托给实际组件。

但是,我不确定这对性能的影响 - 与KeyEventDispatcher不同,KeyEventDispatcher只需要在按下某个键时触发事件,当用户移动鼠标时会生成多个事件 - 而且与KeyEventDispatcher不同,您需要重新启动将事件发送到下部组件以便它处理它。

(抱歉 - stackoverflow没有正确处理SwingUtilities方法的链接......链接显示在下面而不是文本中。)

[3]: http//java.sun.com/j2se/1.4.2/docs/api/javax/swing/SwingUtilities.html#getDeepestComponentAt(java.awt.Component ,int,int)[4]: http: //java.sun.com/j2se/1.4.2/docs/api/javax/swing/SwingUtilities.html#convertMouseEvent(java.awt.Component,java.awt.event.MouseEvent,java.awt.Component

你必须使用JFrame的glassPane: http//java.sun.com/j2se/1.4.2/docs/api/javax/swing/JFrame.html#getGlassPane()

只需使用frm.getGlassPane()获取JFrame的玻璃窗格,并在其上使用addMouseListener()来捕获窗口内的所有鼠标事件。

在类中实现所有与鼠标相关的侦听器,并将该类注册为所有鼠标相关事件的处理程序

鼠标相关接口将是

MouseListener MouseMotionListener MouseWheelListener

您可能希望实现MouseAdapter的子类, MouseAdapter是一个抽象类,它提供Mouse*Listener接口中定义的所有方法的空实现。 完成后,您可以在创建时将其与子组件一起注册为MouseListener 当您指示组件正在“更改”时,如果您希望在JFrame的生命周期中发布组件,则需要确保还取消注册侦听器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM