复杂 gui 的键绑定
Key Bindings for complex gui
我正在尝试让我的应用程序响应键盘输入。最终,我希望它注册 ctrl+f 并启动搜索,但我从简单开始并尝试了 space 栏。 Java 关于使用键绑定的教程让我走到了这一步,但无论我将键绑定应用于什么,都没有任何注册。在下面的代码中,面板是一个 JPanel,其他是已添加到面板的各种摆动对象。
Action ctrlF = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
System.out.println("Action performed");
}
};
panel.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"crtlF");
openStallsList.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"crtlF");
openStalls.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"crtlF");
stallScroller.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"crtlF");
assignLabel.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"crtlF");
tenantInfo.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"crtlF");
unitSpinner.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"crtlF");
buildingAddress.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"crtlF");
buildingLogo.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"crtlF");
我在这里错过了什么?跟专注有关系吗?有几个分类标签和按钮未包含在该列表中。有没有办法让面板注册所有子项的所有输入?
谢谢
首先,您需要将 KeyStroke
绑定到某种 "key"。现在就个人而言,指定虚拟键然后使用 String
更容易,因为 String
值可能有点喜怒无常,但这就是我
panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0),"crtlF");
接下来,您需要将 "key" 绑定到 Action
panel.getActionMap().put("crtlF", ctrlF);
有关详细信息,请参阅 How to use key bindings。
您将遇到的下一个问题是在触发键绑定之前需要聚焦组件
您可以尝试使用 WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
or WHEN_IN_FOCUSED_WINDOW
来获得具有不同焦点要求的 InputMap
,这将允许您更改组件所需的焦点级别,以便触发键绑定.
即
int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
InputMap inputMap = panel.getInputMap(condition);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0),"crtlF");
//... etc
我正在尝试让我的应用程序响应键盘输入。最终,我希望它注册 ctrl+f 并启动搜索,但我从简单开始并尝试了 space 栏。 Java 关于使用键绑定的教程让我走到了这一步,但无论我将键绑定应用于什么,都没有任何注册。在下面的代码中,面板是一个 JPanel,其他是已添加到面板的各种摆动对象。
Action ctrlF = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
System.out.println("Action performed");
}
};
panel.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"crtlF");
openStallsList.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"crtlF");
openStalls.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"crtlF");
stallScroller.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"crtlF");
assignLabel.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"crtlF");
tenantInfo.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"crtlF");
unitSpinner.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"crtlF");
buildingAddress.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"crtlF");
buildingLogo.getInputMap().put(KeyStroke.getKeyStroke("SPACE"),"crtlF");
我在这里错过了什么?跟专注有关系吗?有几个分类标签和按钮未包含在该列表中。有没有办法让面板注册所有子项的所有输入?
谢谢
首先,您需要将 KeyStroke
绑定到某种 "key"。现在就个人而言,指定虚拟键然后使用 String
更容易,因为 String
值可能有点喜怒无常,但这就是我
panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0),"crtlF");
接下来,您需要将 "key" 绑定到 Action
panel.getActionMap().put("crtlF", ctrlF);
有关详细信息,请参阅 How to use key bindings。
您将遇到的下一个问题是在触发键绑定之前需要聚焦组件
您可以尝试使用 WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
or WHEN_IN_FOCUSED_WINDOW
来获得具有不同焦点要求的 InputMap
,这将允许您更改组件所需的焦点级别,以便触发键绑定.
即
int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
InputMap inputMap = panel.getInputMap(condition);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0),"crtlF");
//... etc