正如我在评论中已经提到的,为应用程序全局拦截 KeyEvents 设计的类是KeyEventDispatcher:
KeyEventDispatcher 与当前的 KeyboardFocusManager 在所有 KeyEvent 的定位和调度中协作。使用当前 KeyboardFocusManager 注册的 KeyEventDispatcher 将在将 KeyEvent 分派到其目标之前接收它们,从而允许每个 KeyEventDispatcher 重新定位事件、使用它、分派事件本身或进行其他更改。
因此,任务是实现一个调度程序,它在 dispatch(KeyEvent) 方法中执行您想要的操作,例如:
public class MyDispatcher implements KeyEventDispatcher {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (!e.isConsumed()) {
if (processMyStuff(e)) {
e.consume();
}
}
return false;
}
protected boolean processMyStuff(KeyEvent e) {
if (!isMyTrigger(e)) return false;
doMyStuff();
return true;
}
}
// usage:
KeyboardFocusManager.getCurrentKeyboardFocusManager()
.addKeyEventDispatcher(new MyDispatcher());
请注意,您可以通过向 Toolkit 添加全局侦听器来实现目标,但需要注意以下几点:
- 作为一般规则,使用最适合工作的工具,特别是如果它是为满足确切要求而设计的
- AWTEventListener 可能无法在安全受限的上下文中工作