Предотвратить ввод события из пузыря в главное окно - PullRequest
1 голос
/ 22 октября 2010

У меня есть пользовательский компонент Swing под названием NavigationLink, который расширяет JLabel и реализует прослушиватель ключевых событий следующим образом:

addKeyListener(new KeyAdapter() {
    public void keyReleased(KeyEvent e) {
        boolean actionInvoked = e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_SPACE;
        if (actionInvoked && NavigationLink.this.clickAction != null) {
            NavigationLink.this.clickAction.run();
        }
    }
});

clickAction - это Runnable, который открывает JOptionPane.showMessageDialog, который содержит одну кнопку «ОК».».Все это прекрасно работает, проблема в следующем:

  1. Пользователь переходит на NavigationLink с помощью TAB, пока не становится в фокусе
  2. Используйте клавишу ВВОД, открыв диалоговое сообщение, скнопка «ОК» в фокусе по умолчанию
  3. Пользователь нажимает клавишу ВВОД, которая закрывает диалоговое окно, но также вызывает событие keyReleased в нашей NavigationLink, немедленно открывая диалоговое окно!

Как я могу отменить событие ВВОД после того, как оно было обработано, но кнопка «ОК» диалогового окна?

Ответы [ 2 ]

1 голос
/ 22 октября 2010

НЕ используйте KeyListeners.

Вы должны использовать Привязки клавиш , чтобы связать клавишу ввода с действием.

0 голосов
/ 22 октября 2010

Вы можете попробовать проверить источник KeyEvent в методе keyReleased, вызвав getSource (). Если источником не является компонент NavigationLink, не вызывайте NavigationLink.this.clickAction.run ().

...