簡體   English   中英

如何在所有組件中監聽按鍵(在Java Swing中)?

[英]How can I listen for key presses (within Java Swing) across all components?

我想聽一些關鍵組合,比如Control + S,而不是在我的Swing應用程序中為每個組件添加關鍵監聽器。 我怎樣才能做到這一點?

有可能的。

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

這將抓住所有關鍵事件。 返回false允許鍵盤焦點管理器恢復正常的鍵事件調度到各種組件。

如果你想捕捉關鍵的組合,你可以保留一組“按下的鍵”。 每當按下一個鍵時,將其添加到該組中並檢查該組中已有的鍵。 釋放鑰匙后,將其從設備中取出。

非常簡單我的朋友:你所要做的就是創建一個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;
  }
}

我認為沒有辦法像你想要的那樣添加一個“全局”關鍵監聽器。 這個有類似問題的論壇帖子支持我。 您只需要將它們添加到每個組件。 這應該只需要做一次,所以我想你可以把它完成並繼續前進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM