Как правило, ваше ключевое событие не перехватывается правильным компонентом Swing.Вы должны понимать, что первый компонент под курсором получит событие клавиатуры.Если бы вы выбирали кнопку с помощью клавиатуры, именно этот JButton получал бы ключевое событие.
Чтобы убедиться, что вы получаете все эти события, вам не нужно регистрироваться на компонентах, а скорееиспользуя KeyboardFocusManager
, который будет получать ключевые события, где бы они ни происходили.
Ваш код тогда требует следующих элементов:
KeyEventDispatcher myKeyEventDispatcher = new DefaultFocusManager();
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(myKeyEventDispatcher);
myKeyEventDispatcher
будет принимать вызовыdispatchKeyEvent
всякий раз, когда нажимается клавиша, где бы она ни находилась в пользовательском интерфейсе.Таким образом, вы можете убедиться, что ваш код вызывается правильно.
Альтернативный метод регистрации ключевого слушателя потребует от вас использования HierarchyListener
для добавления ключевого слушателя.: удалено для каждого компонента свинга, который кажется добавленным / удаленным как дочерний элемент вашего корневого компонента.Это не только громоздко для написания, но и очень трудно отладить и понять.
Именно поэтому я предпочитаю более грубый, но довольно элегантный способ добавления слушателя глобальной клавиши приложения к определенному фокусу клавиатурыменеджер.