无论 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 或 HorizontalGridView 中的项目绘制焦点?