2013-10-24 47 views
0

我有一段代碼,它允許我捕獲擊鍵並用System.out.println打印它們。我的問題是,當我嘗試使用CTRL(例如CTRL + 米)使用它,它消除了鍵作爲keyChar屬性。有誰知道爲什麼會發生這種情況,我該如何解決它?按鍵捕捉。 ctrl使KeyChar屬性爲空

 public TestForm() { 
     initComponents(); 
KeyEventDispatcher keyEventDispatcher = new KeyEventDispatcher() { 
    @Override 
    public boolean dispatchKeyEvent(final KeyEvent e) 
    { 
    if (e.getID() == KeyEvent.KEY_PRESSED && e.isAltDown()) 
     { 
     System.out.println("ALT + "+e.getKeyChar()); 
     } 
    else if (e.getID() == KeyEvent.KEY_PRESSED && e.isShiftDown()) 
     { 
      System.out.println("SHIFT + "+e.getKeyChar()); 
     } 
    else if (e.getID() == KeyEvent.KEY_PRESSED && e.isControlDown()) 
     { 
      System.out.println("CTRL + "+e.getKeyChar()/*+"\n"+e*/); 
     } 
    else 
    { 
     System.out.println(e); 
    } 
      return  true; 
     } 
    }; 


KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(keyEventDispatcher) 

;   
} 

我對Java很新,所以它可能是一些簡單的問題。在此先感謝

回答

3

關鍵代碼和關鍵字符號之間有一個重要區別。鍵碼代表鍵盤上的鍵。關鍵字符表示某個字母表中的一個字母。在鍵盤上有一個ctrl鍵,但是對於ctrl,在任何字母表中沒有字母(例如,沒有Unicode字符)。所以當按下按鍵ctrl時,你將得到一個KEY_PRESSED事件和一個鍵碼但沒有鍵字符。

雖然不是所有的希望都消失了。它看起來像你想的時候CTRL和一些字符是否被按下(例如,如果我輸入CTRL +一個,而不是僅僅一個)。問題是您正在查看KEY_PRESSED事件。在Java中,KEY_PRESSED事件和KEY_TYPED事件之間存在重要區別。

對於〔實施例,如果我按按Ctrl + 我的鍵盤還是先按下按Ctrl鍵上的一個,然後按下一個鍵,則或多或少地釋放他們的同時。在我看來,我認爲這是一個行動,但事實並非如此。會發生什麼事在Java是你:

KEY_PRESSED (keyCode = VK_CTRL, keyChar = CHAR_UNDEFINED) //I press down Ctrl key 
KEY_PRESSED (keyCode = VK_A, keyChar = CHAR_UNDEFINED) //I press down the a key 
KEY_TYPED (keyCode = VK_UNDEFINED, keyChar = 'A') //The 'typing' of the letter 'A' 
//some key released events that are not relevant to this discussion 

正如你所看到的,一個KEY_PRESSED事件有一個關鍵的代碼,但沒有鑰匙CHAR(當鍵盤上的鍵被按下,這是解僱)。 KEY_TYPED事件具有關鍵字符但不包含關鍵字代碼(這表示完成了產生字母的關鍵序列)。

所有這些都記錄在KeyEvent頁面的javadoc上。