【问题标题】:Best way to let the user choose a hotkey and then save it?让用户选择热键然后保存的最佳方法?
【发布时间】:2015-02-20 01:19:35
【问题描述】:

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

KeyEvent 类有以下警告:

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

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

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

【问题讨论】:

    标签: java swing hotkeys


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      虽然新的键码可能是现有码的超集,但用户可以随时更改或添加键盘。通过允许用户重新分配小说keyboard layout 所需的密钥,可以减轻这种风险。在这个完整的示例中,org.gcs.robot.RobotChase 管理应用程序已知的所有击键的enum KeyRCKeys,见 here,显示一个对话框,允许用户任意重新分配键。 RCPrefs 包括在 java.util.prefs.Preferences 的实例中保存和恢复所选键码值的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 2012-09-27
        • 2010-10-19
        • 2011-09-27
        • 1970-01-01
        • 2010-10-14
        相关资源
        最近更新 更多