Как заставить все компоненты в приложении реагировать на конкретное ключевое событие? - PullRequest
4 голосов
/ 28 января 2011

Я имею в виду, что, нажав «F5» в веб-браузере, вы обновите веб-страницу независимо от того, где находится фокус.Как я могу сделать это в Java с приложением GUI?Я могу сделать addKeylistener для всех компонентов, но я уверен, что это не правильный путь.

Ответы [ 4 ]

7 голосов
/ 28 января 2011

Вы можете использовать механизм ввода и действий Swing:

component.getRootPane().getInputMap(JRootPane.WHEN_IN_FOCUSED_WINDOW)
          .put(KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0), "refresh");
component.getRootPane().getActionMap().put("refresh", new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // Code here
    }
});
3 голосов
/ 28 января 2011

Лучшее решение для такого рода задач - зарегистрировать слушателя в стандартном KeyboardFocusManager, как я недавно объяснил в этом ответе .

2 голосов
/ 28 января 2011

Другой вариант - использовать строку меню для вашего приложения. Тогда Refresh просто становится пунктом меню в меню, и вы можете назначить F5 в качестве ускорителя для пункта меню. За кулисами он будет делать привязки клавиш для вас.

Это хороший подход, потому что теперь у вас есть самодокументированный графический интерфейс. Пользователь может вызвать обновление, выполнив поиск в меню для различных опций. Опытные пользователи в конечном итоге изучат клавишу ускорения и даже не будут использовать мышь. Как и во всех графических интерфейсах, вы можете вызывать функцию с помощью клавиатуры или мыши.

1 голос
/ 28 января 2011

Вы можете добавить AWTEventListener к java.awt.Toolkit

    AWTEventListener listener = new AWTEventListener() {            
        @Override
        public void eventDispatched(AWTEvent ev) {
            if (ev instanceof KeyEvent) {
                KeyEvent key = (KeyEvent) ev;
                if (key.getID() == KeyEvent.KEY_PRESSED && KeyEvent.getKeyText(key.getKeyCode()).equals("F5")) {
                    System.out.println(ev);
                    // TODO something meaningfull
                    key.consume();
                }
            }
        }
    };

    Toolkit.getDefaultToolkit().addAWTEventListener(listener, AWTEvent.KEY_EVENT_MASK);
...