复杂gui的关键绑定

时间:2015-04-10 22:20:45

标签: java swing key-bindings

我正在尝试让我的应用程序响应键盘输入。最终,我希望它注册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");

我在这里缺少什么?它与焦点有关吗?这个列表中没有包含几个各种各样的标签和按钮。有没有办法让小组记录所有孩子的所有输入?

由于

1 个答案:

答案 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_COMPONENTWHEN_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