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