Java如何使用键绑定拦截窗口上任何位置的键组合

时间:2012-08-21 21:34:27

标签: java swing key-bindings swingx keystrokes

我的应用程序将用于小型双引擎飞机。环境“颠簸”,乳头“鼠标”非常难以使用(即使在衣架中!)。我需要能够拦截用户想要采取的至少所有常用操作的组合键。例如,这些将包括执行校准的 alt-C alt-R 以开始记录数据, alt-X 以包含app优雅地关闭等等。

我只在演示类中使用了键绑定,并且不了解如何在整个窗口中使用它们。我在我的JFrame的ContentPane上放了5个包含其他JPPnels和组件的JPanel。我发现的所有示例都假设某些组件具有焦点,但推动TAB 23次以获取组件是不合理的。

该应用程序将在LINUX下运行,可能是Ubuntu。

2 个答案:

答案 0 :(得分:4)

在摇摆中你应该在主面板的动作贴图中添加一个KeyStroke:例如,下面的代码让你刷新包含JPanel的JFrame,每次按[F10]键:

public class MainWindow extends JFrame{
    JPanel central;

    public MainWindow(){
        central = new JPanel();
        // I assume you define your other 5 panels here
        // and add them to the central JPanel.
        getContentPane().add(central, BorderLayout.CENTER);
        registerRefreshAction();
    }

    private void registerRefreshAction(){
        javax.swing.Action refresh = new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                JFrame frame = (JFrame) getTopLevelAncestor();
                frame.setVisible(false);
                frame.getContentPane().repaint();
                frame.setVisible(true);
            }
        };
        KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_F10, 0);
        central.getActionMap().put("Refresh", refresh);
        central.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, "Refresh");
    }
}

您应该在构造函数的某个位置调用registerRefreshAction,如前所示。您提到的其他组件包含在5个面板内,无需显示。它在Linux中运行。

答案 1 :(得分:2)

你可以尝试

getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);

getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);

我可能会在自定义内容窗格

上建立此功能
JPanel myContentPane = new JPanel();
frame.setContentPane(myContentPane);

或使用根窗格的输入地图

如果这不起作用,还有另一种方法,但我更愿意看看这是否有效