2013-10-24 15 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上。