复杂 gui 的键绑定

Key Bindings for complex gui

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

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

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

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

有关详细信息,请参阅 How to use key bindings

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

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