我想监听键组合,例如 Control + S ,而不会在Swing应用程序中为每个组件添加键侦听器。我怎样才能做到这一点?
答案 0 :(得分:54)
有可能。
KeyboardFocusManager.getCurrentKeyboardFocusManager()
.addKeyEventDispatcher(new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
System.out.println("Got key event!");
return false;
}
});
这将抓住所有关键事件。返回false允许键盘焦点管理器恢复正常的键事件调度到各种组件。
如果要捕捉关键组合,可以保留一组“按下的键”。每当按下一个键时,将其添加到该组中并检查该组中已有的键。释放钥匙后,将其从设备中删除。
答案 1 :(得分:0)
我认为没有办法像你想要的那样添加“全局”键监听器。这个带有类似问题的forum post支持我。您只需要将它们添加到每个组件。这应该只需要做一次,所以我想你可以把它完成并继续前进。
答案 2 :(得分:0)
我的朋友非常简单: 你所要做的就是创造一个 class KeyEventDispatcher并注册到KeyboardFocusManager C.1
然后解析并提取状态和密钥信息,参见:C.2 但奇怪的是,你必须通过ThatEvent.getID();
获得KEY STATE看起来像我的一个小姐。
/////////////////////////////////////////////////////////////////////////////////////////// C.1)
KeyDispatcher ThisKeyDispatcher = new KeyDispatcher();
KeyboardFocusManager ThisKbFocusMngr = KeyboardFocusManager
. getCurrentKeyboardFocusManager();
ThisKbFocusMngr . addKeyEventDispatcher(ThisKeyDispatcher);
return ThisKeyDispatcher;
///////////////////////////////////////////////////////////////////////////////////////////
C.2
public static class KeyDispatcher implements KeyEventDispatcher {
public boolean dispatchKeyEvent(final KeyEvent ThatEvent) {
KeyboardFocusManager ThisKbFocusMngr = null;
Component ThisComponent = null;
Container ThisRoot = null;
Window ThisWindow = null;
int ThisKeyStateEvent = 0;
try {
ThisKbFocusMngr = KeyboardFocusManager . getCurrentKeyboardFocusManager();
ThisComponent = ThisKbFocusMngr . getFocusOwner();
ThisRoot = ThisKbFocusMngr . getCurrentFocusCycleRoot();
ThisWindow = ThisKbFocusMngr . getActiveWindow();
ThisKeyStateEvent = ThatEvent.getID(); // i.e. KeyEvent.KEY_RELEASED
if(false == ThatEvent.isConsumed()) {
boolean RetBool = false;
if((KeyEvent.VK_BACK == ThatEvent.getKeyCode())) {
RetBool = true;
} else {
RetBool = m_CallSomeoneEvent(ThatEvent);
}
if(RetBool) {
ThatEvent.consume();
return true;
}
}
}
catch( Throwable e ) {
LogThis(". ", e);
}
return false;
}
}