Swing:全局键盘剪切

时间:2016-03-16 14:09:50

标签: java swing key-events jtextcomponent

所以Swing文本组件提供了一种方法来实现全局键盘shorcuts。 JTextComponent.getKeyMap(JTextComponent.DEFAULT_KEYMAP)提供了一种修改所有Swing文本组件继承的全局默认键映射的方法。但其他组件是否有办法全局设置键绑定?

我问这个的原因是因为在工作中我们有一个我们正在研究的传统Swing应用程序,并且有些行为对于我们在其中没有的其他应用程序来说非常标准。例如,按下escape来关闭对话框。虽然我可以浏览整个代码库,找到对话框的每个实例,并添加此行为,但能够将全局键绑定添加到组件中会很好。

理想情况下,这种全局行为可以应用于特定的类(即,一些到JDialog,一些到JFrame等),但如果它必须是100%全局的那么好。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

每个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中,因此我不知道是否支持InputMaps。您可以尝试添加“Dialog.ancestorInputMap”并创建自己的绑定,看看是否有效。

否则你可以尝试使用“RootPane.ancestorInputMap”,虽然我猜这个InputMap会被框架和对话框共享。

您还可以查看Escape Key and Dialog以查找绑定到Action的输入映射的JRootPane