因為 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 嗎?
沒有留言:
張貼留言