如果在生成字符时发生KEY_TYPED事件,那么为什么KeyEvent的代码参数包含VK_UNDEFINED?

时间:2015-01-05 20:36:22

标签: java keyevent

我正在接受Java的帮助:Herbert Schildt完整的参考文献(第8版),以了解Java。 在阅读时,我发现只有在生成字符时才会发生KEY_TYPED事件。这是否意味着生成了一个字符(0-9,A-Z)?如果是这样,则不应将相应的ASCII等价物作为代码传递给KeyEvent构造函数:

KeyEvent(Component src, int type, long when, int modifiers, int code, char ch)

但该书说,对于KEY_TYPED事件,代码将包含VK_UNDEFINED。这里的代码不是用键入的键定义的吗?

1 个答案:

答案 0 :(得分:4)

这是因为KEY_TYPED事件不一定具有相应的VK代码。 VK代码来自键盘,代表一把钥匙。如果我按下'a'键,我会看到一个带有VK_A代码的按键事件。现在,正如您所说,KEY_TYPED事件在生成字符时发生。问题是,在通过依赖于语言环境的字符映射转换VK代码后,操作系统会生成字符。

例如,使用我的键盘,我可以键入具有特定键组合的'ö'。这将使用VK_SHIFT,VK_DEAD_CIRCUMFLEX和VK_O触发一堆关键事件,但只有一个KEY_TYPED事件,带有'ö'字符。更糟糕的是,我可以通过按6键(ALT + 0 + 1 + 4 + 1 + 4)键入'†',但同样只会触发一个KEY_TYPED事件。现在,你会在活动中加入什么样的VK代码?这并不意味着什么,所以他们决定总是让VK_UNDEFINED保持一致,即使是简单的字符。