我从用于创建本地和全局快捷方式的KeyStroke
对象(通过KeyEvent
事件(附加了keyPressed
的KeyListener
事件))获得了一个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(),则可以解决未定义键码的问题。