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

时间:2011-03-17 20:26:36

标签: java swing keylistener

我想监听键组合,例如 Control + S ,而不会在Swing应用程序中为每个组件添加键侦听器。我怎样才能做到这一点?

3 个答案:

答案 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;
  }
}