所以 Swing 文本组件提供了一种具有全局键盘剪切的方法。JTextComponent.getKeyMap(JTextComponent.DEFAULT_KEYMAP) 提供了一种修改所有 Swing 文本组件继承的全局默认键盘映射的方法。但是其他组件有办法全局设置键绑定吗?
我问这个问题的原因是,在工作中,我们有一个我们正在处理的遗留 Swing 应用程序,并且有些行为对于我们在其中没有的其他应用程序来说是非常标准的。例如,按 esc 关闭对话框之类的操作。虽然我可以浏览整个代码库,找到对话框的每个实例并添加此行为,但能够将键绑定全局添加到组件会很好。
理想情况下,这种全局行为将能够应用于特定的类(即,一些应用于 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组件实现了哪些InputMaps。
框架和对话框没有出现在UIManager中,所以我不知道它们是否支持输入映射。您可以尝试添加"Dialog.ancestorInputMap"并创建自己的绑定,看看这是否有效。
否则,您可以尝试使用"RootPane.ancestorInputMap",尽管我猜这个InputMap将由框架和对话框共享。
您还可以查看绑定到JRootPane
输入映射的Action
的转义键和对话框。