我从用于创建本地和全局快捷方式的KeyStroke对象(通过KeyEvent事件(附加了keyPressedKeyListener事件))获得了一个JTextField对象。我将keyStroke.getkeyCode()keyStroke.getModifiers()保存到文件中,以便在重新启动应用程序时重新创建快捷方式。据我了解,这些值直接对应于基于KeyEvent常量的VK_类的等效方法。

KeyEvent类具有以下警告:


  警告:除了Java语言(VK_ENTER,VK_BACK_SPACE和VK_TAB)定义的那些键外,不要依赖VK_常量的值。 Sun保留根据需要更改这些值的权利,以在将来适应更大范围的键盘。


那么这是否意味着我不应该在会话之间存储keyCode,因为在将来的Java版本中它可能会更改?如果是这样,我应该存储什么呢?我正在考虑存储键的名称,因为它在VK_常量中使用,并且也用于KeyStroke.getKeyStroke()方法之一,但是我不确定这是否会更好以及如何实际获得适当的名称串。

另外,我不太确定在捕获热键时如何最好地处理不同的键盘布局。看来getKeyCode()有时会在不同的布局上产生未定义的代码。

最佳答案

这些值不太可能会改变,但是是的,它们可能会改变。

最简单的解决方案是存储通过调用KeyStroke的toString()方法返回的字符串。保证该字符串可由KeyStroke.getKeyStroke(String)解析,这是读取保存的首选项时应调用的名称。

我认为,如果使用getExtendedKeyCode()而不是getKeyCode(),则可以解决未定义键码的问题。

10-06 13:48