Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 复杂gui的键绑定_Java_Swing_Key Bindings - Fatal编程技术网

Java 复杂gui的键绑定

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

我正在尝试让我的应用程序响应键盘输入。最后,我希望它注册ctrl+f并启动搜索,但我从简单开始,并尝试使用空格键。关于使用键绑定的Java教程让我走了这么远,但无论我将键绑定应用到什么,都没有注册。在下面的代码中,面板是一个JPanel,其他面板是添加到面板中的各种swing对象

    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