如何添加全局动作事件侦听器?我试过了
Toolkit.getDefaultToolkit ().addAWTEventListener (this, AWTEvent.ACTION_EVENT_MASK);
但它不起作用。
答案 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