2012年9月20日 星期四

Java GUI 的鍵盤監聽事件

在實作 Java GUI 的鍵盤事件時,可能會遇到一直監聽不到的問題
因為 JFrame 如果有子元件,focus 的狀態就會被傳遞到子元件上
此時就會因為 JFrame 一直不會被 focus,因此也不會觸發 JFrame 上的鍵盤事件。

[1] 提供了攔截 Key Listener 的方法,可以在 GUI 上註冊全域的鍵盤事件
無論目前 focus 的是 GUI 中的哪一個元件,都能夠觸發鍵盤事件。

//Hijack the keyboard manager
KeyboardFocusManager manager =
    KeyboardFocusManager.getCurrentKeyboardFocusManager();
manager.addKeyEventDispatcher( new KeyDispatcher() );
 
//Custom dispatcher
class KeyDispatcher implements KeyEventDispatcher {
  public boolean dispatchKeyEvent(KeyEvent e) {
    if(e.getID() == KeyEvent.KEY_TYPED)
      System.out.println( "typed" + e.getCharCode() )

    //Allow the event to be redispatched
    return false;
    }
}

不過如果需求是要攔截作業系統上所有的鍵盤事件(無論 Java GUI 是否處於 focus 狀態)
則依照 [2] 的回應,這不存在純 Java 的解法,還是必須透過作業系統那邊的方法來傳遞狀態。

參考資料:
1、Java Global JFrame Key Listener
2、請問 Java 有辦法監聽系統所有的 Key Event 嗎?

沒有留言: