2008-11-05 42 views
3

全球按鍵所以我想只要觸發用戶按下空格鍵在我的Swing應用程序的任何地方的事件(暫停/取消暫停一些媒體)。捕獲的Java

既然有如此多的控件和麪板,可能有焦點,它不是真的有可能的KeyEvents添加到他們所有的(更不用說毛額)。

所以我發現

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher() 

這是真棒,你可以註冊全球按鍵預處理器。然而,還是有一個主要問題 - 空格會一直輸入到輸入字段,表格單元格等等中,我顯然不想觸發暫停事件!

所以任何想法? 也許有辦法全局檢測遊標是否集中在允許輸入文字的東西上,而不必檢查所有可編輯控件(嘔吐物!)的列表?

回答

2

我想你回答說,你自己 - 是的,我想你可以找出具有焦點的當前元素,如果它是一個instanceof某一個領域類,你忽略暫停事件的目的的空間。如果它接縫很大,不用擔心,instanceof對於JVM來說非常快(並且在任何情況下你都在談論人類尺度事件,這對處理器來說是一個永恆的事情)。

1

我對我的揮杆生疏,但我想你應該嘗試使用註冊與Toolkit.addAWTEventListener一個KEY_EVENT_MASK全球聽衆。然後,您可以根據其類型和來源過濾AWTEvent處理。

0

好吧...... 以及即時通訊試圖基於源進行過濾。問題是我的編輯組合框... 他們的instanceof

javax.swing.plaf.basic.BasicComboBoxEditor$BorderlessTextField 

而且由於BorderlessTextField是一個私人的內部類,我顯然不能做反對它的instanceof檢查。

想法?

編輯: 確定,所以這個工程....

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(new KeyEventPostProcessor() { 

      public boolean postProcessKeyEvent(KeyEvent e) { 
       if (e.getID() == KeyEvent.KEY_PRESSED) { 
        Object s = e.getComponent(); 
        if (!(s instanceof JTextField) && 
         !(s instanceof JTable && ((JTable) s).isEditing()) 
         ) { 
         music_player.pauseEvent(); 
        } 

        //System.out.println(s.getClass().toString()); 
       } 
       return true; 
      } 
     }); 

它完全總值(GDP),我恨它。 我希望我能想出一種方法來檢查按鍵是否已被任何組件使用 - 那麼當按鍵沒有被任何組件操作時,我只能執行暫停事件。