我从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()
有时会在不同的布局上产生未定义的代码。
答案 0 :(得分:2)
值不太可能会改变,但是,有可能他们可能会改变。
最简单的解决方案是通过调用KeyStroke的toString()方法存储返回的字符串。保证该字符串可由KeyStroke.getKeyStroke(String)解析,这是您在阅读已保存的首选项时应该调用的内容。
我认为如果使用getExtendedKeyCode()而不是getKeyCode(),可以解决未定义键码的问题。
答案 1 :(得分:2)
虽然新密钥代码可能代表现有代码的超集,但用户可以随时更改或添加键盘。允许用户重新分配小说keyboard layout所需的密钥可以减轻这种风险。在这个完整的示例中,org.gcs.robot.RobotChase
管理应用程序已知的所有击键的enum Key
。 RCKeys
RCPrefs
显示一个对话框,允许用户任意重新分配密钥。 java.util.prefs.Preferences
包括在{{1}}的实例中保存和恢复所选密钥代码值的方法。