2

我的应用程序将用于小型双引擎飞机。环境“崎岖不平”,乳头“老鼠”很难使用(即使在衣架中!)。我需要能够至少拦截用户想要执行的所有常用操作的组合键。例如,这些将包括alt-C执行校准,alt-R开始记录数据,alt-X让应用程序正常关闭等。

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

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

4

2 回答 2

4

在 swing 中,您应该在主面板的操作映射中添加一个 KeyStroke:例如,以下代码让您在每次按下 [F10] 键时刷新包含 JPanel 的 JFrame:

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 中运行。

于 2012-08-21T21:48:42.043 回答
2

你可以试试

getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);

或者

getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);

我可能会在自定义内容窗格上建立它

JPanel myContentPane = new JPanel();
frame.setContentPane(myContentPane);

或者使用根窗格的输入映射

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

于 2012-08-21T21:40:55.020 回答