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

If KEY_TYPED event occurs when a character is generated, then why does code parameter to KeyEvent contains VK_UNDEFINED?

我正在从 Herbert Schildt 的 Java:The 完整参考资料(第 8 版)中寻求帮助,以了解 Java。 在阅读时,我发现 KEY_TYPED 事件仅在生成字符时发生。那不是说生成了一个字符(0-9,A-Z)吗?如果是这样,那么不应该将相应的 ASCII 等效项作为 code 传递给 KeyEvent 构造函数:

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

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

这是因为KEY_TYPED事件不一定有相应的VK代码。 VK 代码来自键盘,代表一个键。如果我按下 'a' 键,我将看到带有 VK_A 代码的按键事件。现在,如您所说,KEY_TYPED 事件在生成字符时发生。问题是,字符是由 OS 在通过取决于语言环境的字符映射转换 VK 代码后生成的。

例如,在我的键盘上,我可以使用特定的键组合键入“ö”。这将触发一堆 VK_SHIFT、VK_DEAD_CIRCUMFLEX 和 VK_O 的关键事件,但只有一个 KEY_TYPED 事件,带有 'ö' 字符。更糟糕的是,我可以通过按 6 个键 (ALT+0+1+4+1+4) 来键入“†”,但同样只会触发一个 KEY_TYPED 事件。现在,您会在事件中放入什么 VK 代码?这实际上没有任何意义,所以他们决定始终将 VK_UNDEFINED 保持一致,即使是简单的字符也是如此。