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

Rob*_*hew 9 java swing

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

cam*_*ckr 18

使用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);
Run Code Online (Sandbox Code Playgroud)


Nat*_*ate 7

您可以在整个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)