如何捕获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的生命周期中发布组件,则需要确保还取消注册侦听器。