Java 复杂gui的键绑定
我正在尝试让我的应用程序响应键盘输入。最后,我希望它注册ctrl+f并启动搜索,但我从简单开始,并尝试使用空格键。关于使用键绑定的Java教程让我走了这么远,但无论我将键绑定应用到什么,都没有注册。在下面的代码中,面板是一个JPanel,其他面板是添加到面板中的各种swing对象Java 复杂gui的键绑定,java,swing,key-bindings,Java,Swing,Key Bindings,我正在尝试让我的应用程序响应键盘输入。最后,我希望它注册ctrl+f并启动搜索,但我从简单开始,并尝试使用空格键。关于使用键绑定的Java教程让我走了这么远,但无论我将键绑定应用到什么,都没有注册。在下面的代码中,面板是一个JPanel,其他面板是添加到面板中的各种swing对象 Action ctrlF = new AbstractAction() { public void actionPerformed(ActionEvent e) { Sys
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");
我错过了什么?这和焦点有关吗?有几个分类标签和按钮不包括在该列表中。有没有办法让面板注册它所有子项的所有输入
谢谢首先,您需要将
击键
绑定到某种“键”。现在就我个人而言,是eaiser先指定虚拟键,然后使用字符串
,因为字符串
值可能有点喜怒无常,但这就是我
panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0),"crtlF");
接下来,需要将“键”绑定到操作
panel.getActionMap().put("crtlF", ctrlF);
有关更多详细信息,请参阅
您将遇到的下一个问题是,在触发密钥绑定之前,需要关注组件
您可以尝试使用或获取具有不同焦点要求的InputMap
,这将允许您更改组件所需的焦点级别,以便触发键绑定
i、 e
尝试使用
KeyStroke.getKeyStroke(KeyEvent.VK\u SPACE,0))
而不是使用类似KeyStroke.getKeyStroke(KeyEvent.VK\u F,KeyEvent.CTRL\u DOWN\u MASK)的方法进行尝试。
指定的操作在哪里?(例如panel.getActionMap().put(“crtlF”,ctrlF))您也可以使用JComponent\getInputMap(int)
并将其传递给JComponent。当您在核心组件的窗口中聚焦时,这将允许您建立全局操作,但这将取决于您绑定“crtlF”时尝试实现的目标
通过ActionMap
访问ctrlF
操作
?感谢您的宝贵时间!
int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
InputMap inputMap = panel.getInputMap(condition);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0),"crtlF");
//... etc