У меня есть пользовательский компонент 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, который содержит одну кнопку «ОК».».Все это прекрасно работает, проблема в следующем:
- Пользователь переходит на NavigationLink с помощью TAB, пока не становится в фокусе
- Используйте клавишу ВВОД, открыв диалоговое сообщение, скнопка «ОК» в фокусе по умолчанию
- Пользователь нажимает клавишу ВВОД, которая закрывает диалоговое окно, но также вызывает событие keyReleased в нашей NavigationLink, немедленно открывая диалоговое окно!
Как я могу отменить событие ВВОД после того, как оно было обработано, но кнопка «ОК» диалогового окна?