Чтобы определить, происходит ли событие от нажатия клавиши или отпускания клавиши, выполните

аюсь добавить ключевой слушатель, который содержитJTabbedPane.
Он должен переключать вкладки при получении Ctrl + Tab.
Но событие нажатия клавиш никогда не отправляется. Я пытался добавить его на панель и к объекту с вкладками, но безуспешно.

Вот мой код

SwitchTabsListener ctrlTabListener = new SwitchTabsListener(genericTabbedPanel);  
jMainFrame.addKeyListener(ctrlTabListener);  
genericTabbedPanel.addKeyListener(ctrlTabListener);  

Ответы на вопрос(1)

Решение Вопроса

ваше ключевое событие не перехватывается правильным компонентом Swing. Вы должны понимать, что первый компонент под курсором получит событие клавиатуры. Если бы вы выбрали кнопку на клавиатуре, именно этот JButton получил бы ключевое событие.

Чтобы убедиться, что вы получаете все эти события, вам не нужно регистрироваться на компоненты, а скорее с помощьюKeyboardFocusManager, который будет получать ключевые события, где бы они ни происходили.

Ваш код тогда требует следующих элементов

KeyEventDispatcher myKeyEventDispatcher = new DefaultFocusManager();
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(myKeyEventDispatcher);

myKeyEventDispatcher затем будет принимать звонкиdispatchKeyEvent всякий раз, когда нажимается клавиша, где бы она ни находилась в пользовательском интерфейсе. Таким образом, вы можете убедиться, что ваш код вызывается правильно.

Альтернативный метод регистрации ключевого слушателя потребует от вас использованияHierarchyListener для того, чтобы ваш ключевой слушатель был добавлен: удален для каждого компонента свинга, который кажется добавленным / удаленным как дочерний элемент вашего корневого компонента. Это не только громоздко писать, но и очень сложно отлаживать и понимать.

Вот почему я предпочитаю более грубый, но довольно элегантный способ добавления слушателя глобальных клавиш приложения к конкретному диспетчеру фокусировки клавиатуры.

 barwnikk26 июл. 2013 г., 23:49
KeyboarFocusManager.getCurrentKeyboardFocusManager () - вы написали KeyboarFocus ..., но не было 'D' (vaild: Keyboard)
 MadProgrammer08 дек. 2018 г., 00:41
«Вы должны понимать, что первый компонент под курсором получит событие клавиатуры» не соответствует действительности, текущий компонент с фокусом клавиатуры получит ключевое событие (в сфокусированном окне). В наши дни API привязки клавиш, вероятно, является лучшим решением.
 Bick24 янв. 2011 г., 12:29
Спасибо чувак. работает. грубая сила - это путь.

Ваш ответ на вопрос