我正在尝试让我的应用程序响应键盘输入。最终,我希望它注册ctrl + f并启动搜索,但我开始简单并尝试空格键。关于使用Key Bindings的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");
我在这里缺少什么?它与焦点有关吗?这个列表中没有包含几个各种各样的标签和按钮。有没有办法让小组记录所有孩子的所有输入?
由于
答案 0 :(得分:3)
首先,您需要将KeyStroke
绑定到某种“密钥”。现在就个人而言,使用String
来指定虚拟密钥更为明智,因为String
值可能有点气质,但那就是我
panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0),"crtlF");
接下来,您需要将“密钥”绑定到Action
panel.getActionMap().put("crtlF", ctrlF);
有关详细信息,请参阅How to use key bindings。
您将遇到的下一个问题是在触发键绑定之前需要关注组件
您可以尝试使用WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
或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