Вопрос

My application will be used on a small twin engine aircraft. The environment is "bumpy" and the nipple "mouse" is very hard to use (even in the hanger!). I need to be able to intercept key combinations for at least all the commonly used actions the user wants to take. These would include, for example, alt-C to perform a a calibration, alt-R to start recording data, alt-X to have the app shut down gracefully, etc.

I've only used key Bindings in a demo class and do not understand how use them over an entire window. I have put 5 JPanels containing otherJPpanels and components on my JFrame's ContentPane. All the examples I have found assume some component has focus but pushing TAB 23 times to get to a component is unreasonable.

The app will run under LINUX, probably Ubuntu.

Это было полезно?

Решение

In swing you should add a KeyStroke to the main panel's action map: For instance the following code let you refresh the JFrame that contains the JPanel, each time you press [F10] key:

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");
    }
}

You should call registerRefreshAction in some place in your constructor, as shown before. The other components you mention are included inside the 5 panels and don't need to be shown. It is working in Linux.

Другие советы

You could try

getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);

or

getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);

I'd probably establish this on a custom content pane

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

Or use the root pane's input map

If this doesn't work, there is another method, but I'd prefer to see if this works first

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top