如何在所有组件中监听按键(在Java Swing中)?

我想倾听诸如Control + S之类的组合键,而无需向Swing应用程序中的每个组件添加键监听器。 我怎样才能做到这一点?

有可能的。

KeyboardFocusManager.getCurrentKeyboardFocusManager() .addKeyEventDispatcher(new KeyEventDispatcher() { @Override public boolean dispatchKeyEvent(KeyEvent e) { System.out.println("Got key event!"); return false; } }); 

这将抓住所有关键事件。 返回false允许键盘焦点pipe理器恢复正常的按键事件分派到各个组件。

如果你想抓住关键组合,你可以保留一组“按键”。 每当按下某个键时,将其添加到该设置中,并检查该设备中已有哪些键。 当一个钥匙被释放,从集合中删除它。

我不认为有一种方法可以像你想要的那样添加一个“全局”按键侦听器。 这个类似的问题的论坛post支持我。 你只需要将它们添加到每个组件。 这应该只需要做一次,所以我想你可以把它放在一边,继续前进。

很简单,我的朋友:你所要做的就是创build一个KeyEventDispatcher类并注册到KeyboardFocusManager C.1

然后parsing并提取状态和关键信息见: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(); // ie 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; } }