我有一段代码可以捕获按键并使用System.out.println打印它们。我的问题是,当我尝试使用 ctrl (例如 ctrl + m )时,它会删除 m的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很新,所以它可能是一些简单的东西。提前致谢
答案 0 :(得分:3)
密钥代码和密钥字符之间存在重要差异。键码代表键盘上的键。键字代表某些字母表中的字母。键盘上有一个 ctrl 键,但 ctrl 的任何字母都没有字母(例如没有unicode字符)。因此,当按下 ctrl 键时,您将获得一个KEY_PRESSED事件,其中包含一个键代码,但没有键字符。
但并非所有希望都失去了。看起来你正试图检测何时 CTRL 并按下某个字符(例如,如果我键入 ctrl + A 而不是 A )。问题是您正在查看KEY_PRESSED事件。在Java中,KEY_PRESSED事件和KEY_TYPED事件之间存在重要区别。
例如,如果我在键盘上按 Ctrl + A ,我会先按下 Ctrl 键,然后按下 A 键,然后或多或少地同时释放它们。在我看来,我认为这是一个动作,但事实并非如此。 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事件具有键代码但没有键字符(当按下键盘上的键时会触发)。 KEY_TYPED事件具有键char但不是键代码(这表示键序列的完成导致字母)。
所有这些都在KeyEvent页面的javadocs上详细记录。