无论 JComponent 是啥焦点,如何为 JFrame 进行键绑定?

Posted

技术标签:

【中文标题】无论 JComponent 是啥焦点,如何为 JFrame 进行键绑定?【英文标题】:How do you make key binding for a JFrame no matter what JComponent is in focus?无论 JComponent 是什么焦点,如何为 JFrame 进行键绑定? 【发布时间】:2013-11-12 06:22:31 【问题描述】:

无论框架中的焦点是什么,我们如何为 JFrame 进行键绑定?

我已经看过这个问题了:How do you make key bindings for a java.awt.Frame?

我尝试为 JFrame 的根窗格设置输入映射,但当焦点位于 JTextArea 上时它不起作用,即使 editable 为 false。

使键绑定在整个 JFrame 中工作的最简单方法是什么?

【问题讨论】:

【参考方案1】:

你可以试试JComponent#getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)

来自Java Docs

用于 registerKeyboardAction 的常量表示该命令 当接收组件在窗口中时应该调用 具有焦点或本身就是焦点组件。

【讨论】:

【参考方案2】:

正如@camickr 所写,您的文本区域不应绑定相同的键。

现在,这是一个实现:

// Action action = ...
// KeyStroke stroke = ...

JRootPane rootPane = mainJFrame.getRootPane();
rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(stroke, "myAction");
rootPane.getActionMap().put("myAction", action);

【讨论】:

【参考方案3】:

我尝试为 JFrame 的根窗格设置输入映射,但是当焦点位于 JTextArea 上时它不起作用,即使 editable 为 false。

正确。如果组件具有焦点并实现相同的绑定,则该绑定将具有优先权。

如果您不希望该绑定适用于文本区域,则需要从文本区域中删除该绑定。

阅读 How to Use Key Bindings 上的 Swing 教程部分,了解您可以使用的各种 InputMap 的说明以及如何删除绑定的示例。

【讨论】:

以上是关于无论 JComponent 是啥焦点,如何为 JFrame 进行键绑定?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 API < 21 的 EditText 焦点颜色着色?

leanback 库:如何为 VerticalGridView 或 Horizo​​ntalGridView 中的项目绘制焦点?

如何为 keras 使用自定义损失函数

您将如何为地图上各点之间的路线提供路线?缺失的部分是啥?

无论在android中垂直对齐的字数如何,如何为多个文本视图设置相等的宽度?

RF模块是啥