Я пытался выполнить действие, нажимая Enter на кнопке.
System.out.println(KeyStroke.getKeyStroke("ENTER").getKeyCode());
im.put(KeyStroke.getKeyStroke("ESCAPE"),"esc");
im.put(KeyStroke.getKeyStroke("released ESCAPE"),"esc released");
im.put(KeyStroke.getKeyStroke("ENTER"),"enter");
im.put(KeyStroke.getKeyStroke("released ENTER"),"enter released");
Не знаю почему, но sysout получил 10, поэтому карта ввода знает нажатие клавиши со строкой ENTER, но если я возьму ее здесь, она не работает. ESCAPE работает отлично, но ENTER не работает. Если я брошу это на char и сделаю
im.put(KeyStroke.getKeyStroke((char) KeyEvent.VK_ENTER),"enter");
im.put(KeyStroke.getKeyStroke("released ENTER"),"enter released");
Тогда это работает. Но я думаю, что это некрасиво, и я не хочу использовать это, потому что обычно "Enter" должен работать, я думаю.




Проблема в том, и это хорошо документировано, KeyListener ненадежен.
Чтобы KeyListener работал, компонент, для которого он зарегистрирован, ДОЛЖЕН быть фокусируемым И иметь фокус клавиатуры.
Добавление компонентов, таких как JButton, перемещает фокус клавиатуры от вашего компонента и вместо этого передает его другим компонентам, поэтому KeyListener перестает работать.
Существует множество «обходных путей», но, честно говоря, они ненадежны и по сути являются всего лишь взломами.
Вам лучше использовать Key Bindings API, который устраняет недостатки KeyListener и предоставляет гораздо более универсальный и гибкий API.
mhhh Я попробовал. Мой ответ ниже
Пожалуйста, прочтите минимальный воспроизводимый пример