复杂 GUI 的键绑定



我正在尝试让我的应用程序响应键盘输入。最终,我希望它注册 ctrl+f 并启动搜索,但我开始很简单并尝试使用空格键。关于使用键绑定的 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绑定到某种"密钥"。 现在就个人而言,使用String指定虚拟键更容易,因为String值可能有点喜怒无常,但这就是我

panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0),"crtlF");

接下来,您需要将"密钥"绑定到Action

panel.getActionMap().put("crtlF", ctrlF);

有关更多详细信息,请参阅如何使用键绑定。

您将遇到的下一个问题是,在触发键绑定之前,需要聚焦组件

您可以尝试使用 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

最新更新