Java 击键捕捉。ctrl使KeyChar属性为空
我有一段代码,允许我捕获击键并使用System.out.println打印它们。我的问题是,当我尝试将它与ctrl(例如ctrl+m)一起使用时,它会删除m键的KeyChar属性。有人知道为什么会发生这种情况,以及我如何解决它吗Java 击键捕捉。ctrl使KeyChar属性为空,java,Java,我有一段代码,允许我捕获击键并使用System.out.println打印它们。我的问题是,当我尝试将它与ctrl(例如ctrl+m)一起使用时,它会删除m键的KeyChar属性。有人知道为什么会发生这种情况,以及我如何解决它吗 public TestForm() { initComponents(); KeyEventDispatcher keyEventDispatcher = new KeyEventDispatcher() { @Override p
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还很陌生,所以我可能缺少一些简单的东西。提前感谢键代码和键字符之间有一个重要的区别。键代码表示键盘上的键。键字符表示某些字母表中的一个字母。键盘上有一个ctrl键,但任何字母表中都没有用于ctrl的字母(例如,没有unicode字符)。因此,当按下ctrl键时,您会得到一个按键代码为但没有按键字符的按键按下事件 但并非所有的希望都破灭了。看起来您正在尝试检测何时按下CTRL和某个字符(例如,如果键入CTRL+A而不是A)。问题是您正在查看按键事件。在Java中,按键事件和按键类型事件之间有一个重要的区别 对于exmaple,如果我要在键盘上按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类型的事件有一个KEY char,但没有KEY code(这表示一个KEY序列的完成,结果是一个字母)
所有这些都详细记录在页面的javadocs中。键代码和键字符之间有一个重要的区别。键代码表示键盘上的键。键字符表示某些字母表中的一个字母。键盘上有一个ctrl键,但任何字母表中都没有用于ctrl的字母(例如,没有unicode字符)。因此,当按下ctrl键时,您会得到一个按键代码为但没有按键字符的按键按下事件 但并非所有的希望都破灭了。看起来您正在尝试检测何时按下CTRL和某个字符(例如,如果键入CTRL+A而不是A)。问题是您正在查看按键事件。在Java中,按键事件和按键类型事件之间有一个重要的区别 对于exmaple,如果我要在键盘上按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类型的事件有一个KEY char,但没有KEY code(这表示一个KEY序列的完成,结果是一个字母)
所有这些都详细记录在页面的javadocs中。键代码和键字符之间有一个重要的区别。键代码表示键盘上的键。键字符表示某些字母表中的一个字母。键盘上有一个ctrl键,但任何字母表中都没有用于ctrl的字母(例如,没有unicode字符)。因此,当按下ctrl键时,您会得到一个按键代码为但没有按键字符的按键按下事件 但并非所有的希望都破灭了。看起来您正在尝试检测何时按下CTRL和某个字符(例如,如果键入CTRL+A而不是A)。问题是您正在查看按键事件。在Java中,按键事件和按键类型事件之间有一个重要的区别 对于exmaple,如果我要在键盘上按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类型的事件有一个KEY char,但没有KEY code(这表示一个KEY序列的完成,结果是一个字母)
所有这些都详细记录在页面的javadocs中。键代码和键字符之间有一个重要的区别。键代码表示键盘上的键。键字符表示某些字母表中的一个字母。键盘上有一个ctrl键,但任何字母表中都没有用于ctrl的字母(例如,没有unicode字符)。因此,当按下ctrl键时,您会得到一个按键代码为但没有按键字符的按键按下事件 但并非所有的希望都破灭了。看起来您正在尝试检测何时按下CTRL和某个字符(例如,如果键入CTRL+A而不是A)。问题是您正在查看按键事件。在Java中,按键事件和按键类型事件之间有一个重要的区别 对于exmaple,如果我要在键盘上按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类型的事件有一个KEY char,但没有KEY code(这表示一个KEY序列的完成,结果是一个字母)
所有这些都详细记录在页面的javadocs中