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

4
如何添加全局事件监听器?我已经尝试过:
Toolkit.getDefaultToolkit ().addAWTEventListener (this, AWTEvent.ACTION_EVENT_MASK); 

但是它没有起作用。

3个回答

5

如果您想在应用程序中监听所有的鼠标和键盘事件,可以使用以下代码:

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);

由于此代码在事件分发线程上执行,因此您需要确保它快速执行以防止GUI变得无响应。如果您想查看一个可工作的示例,请参考此处所使用的方法。

更多信息请参见:全局事件监听器

这里还有一份详尽的研究资料:AWT事件监听器


3
全局监听操作事件对于Swing组件(如JButtons)无法起作用,因为它们直接调用其侦听器而不是通过AWT事件队列分派事件。Java bug 6292132描述了这个问题。
不幸的是,我不知道有什么解决方法,除了向每个组件注册侦听器。

2

在Java Swing中有全局事件分发器,您可以使用它。它的基本作用是拦截事件,执行自定义逻辑并将其分派到实际组件。例如,如果您希望拦截鼠标单击事件-

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);
    });

你可以在这里找到更多信息 - 事件分发器

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接