如何添加全局动作事件监听器?

时间:2011-10-13 11:53:33

标签: java events

如何添加全局动作事件侦听器?我试过了

Toolkit.getDefaultToolkit ().addAWTEventListener (this, AWTEvent.ACTION_EVENT_MASK); 

但它不起作用。

3 个答案:

答案 0 :(得分:3)

(示例)侦听可以使用的应用程序中的所有MouseEvents和KeyEvent:

long eventMask = AWTEvent.MOUSE_MOTION_EVENT_MASK
    + AWTEvent.MOUSE_EVENT_MASK
    + AWTEvent.KEY_EVENT_MASK;

Toolkit.getDefaultToolkit().addAWTEventListener( new AWTEventListener()
{
    public void eventDispatched(AWTEvent e)
    {
        System.out.println(e.getID());
    }
}, eventMask);

当此代码在Event Dispatch Thread上执行时,您需要确保它快速执行以防止GUI无响应。如果你想看一个有效的例子,可以使用上面的方法 here

有关详细信息,请参阅此处:Global Event listeners

这是一项彻底的研究:AWT Event Listener

答案 1 :(得分:3)

全局侦听Action Events对于像JButton这样的Swing组件不起作用,因为它们直接调用侦听器而不是通过AWT事件队列调度事件。 Java bug 6292132描述了这个问题。

不幸的是,我知道没有解决方法,只需在每个组件上注册监听器。

答案 2 :(得分:1)

您可以使用java swing中的Global Event Dispatcher。它基本上做的是拦截事件,执行自定义逻辑并将其分发给实际组件。例如,如果您希望拦截鼠标单击事件 -

EventQueue eventQueue = java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue();
    eventQueue.push(new EventQueue()
    {
        @Override
        public void dispatchEvent(java.awt.AWTEvent awtEvent)
        {
            if((awtEvent instanceof MouseEvent && awtEvent.getID() == MouseEvent.MOUSE_CLICKED)
            {
                // do your custom logic here
            }
        }
    super.dispatchEvent(awtEvent);
    });

您可以在此处找到更多相关信息 - Event Dispatchers