Swing 文本组件提供了一种拥有全局键盘快捷键的方法。 JTextComponent.getKeyMap(JTextComponent.DEFAULT_KEYMAP) 提供了一种修改所有 Swing 文本组件继承的全局默认键盘映射的方法。但是其他组件有办法全局设置键绑定(bind)吗?
我问这个问题的原因是因为在工作中我们正在开发一个遗留的 Swing 应用程序,并且有些行为对于其他应用程序来说是相当标准的,但我们只是没有。例如,按 Esc 键关闭对话框之类的事情。虽然我可以浏览整个代码库,找到对话框的每个实例,并添加此行为,但如果能够向组件全局添加键绑定(bind),那就太好了。
理想情况下,这种全局行为能够应用于特定的类(即,一些应用于 JDialog,一些应用于 JFrame 等),但如果它必须是 100% 全局的,那就没问题了。
有什么想法吗?
最佳答案
每个 Swing 组件都有一个由同一类型的所有组件共享的 InputMap
。对此 InputMap
的更改将影响所有组件。
例如,所有JTextAreas
共享一个focusInputMap
。要禁用使用 Control-A 选择所有文本的功能,您可以使用如下代码:
InputMap im = (InputMap) UIManager.get("TextArea.focusInputMap");
KeyStroke keyStroke = KeyStroke.getKeyStroke("control A");
im.put(keyStroke, "none");
您可以查看UIManager Defaults查看为给定 Swing 组件实现了哪些 InputMap。
框架和对话框没有出现在 UIManager 中,所以我不知道它们是否支持输入映射。您可以尝试添加“Dialog.ancestorInputMap”并创建自己的绑定(bind)以查看是否有效。
否则,您可以尝试使用“RootPane.ancestorInputMap”,尽管我猜测此InputMap将由框架和对话框共享。
您还可以查看Escape Key and Dialog对于绑定(bind)到 JRootPane
的 InputMap 的 Action
。
关于java - Swing:全局键盘快捷键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36038120/