Java KeyListener не регистрирует клавиши со стрелками

Я пишу простую программу на Java, которая включает KeyListener с последующим переопределением метода KeyTyped:

@Override public void keyTyped(KeyEvent e) { int key = e.getKeyCode(); System.out.println("TEST"); if (key == KeyEvent.VK_KP_LEFT || key == KeyEvent.VK_LEFT) { System.out.println("LEFT"); //Call some function } else if (key == KeyEvent.VK_KP_RIGHT || key == KeyEvent.VK_RIGHT) { System.out.println("RIGHT"); //Call some function } } 

Когда я печатаю ничего, кроме клавиш со стрелками (например, «a»), он печатает TEST как следует. Однако, когда я набираю клавишу стрелки numpad, она печатает только TEST и когда я набираю стандартную клавишу со стрелкой, она вообще ничего не печатает. Возможно, потому, что я на ноутбуке, или я только что сделал глупую ошибку?

Да, вы увидите, что клавиши со стрелками отвечают на keyPressed и keyReleased, а не на keyTyped. Мой SSCCE :

 import java.awt.Dimension; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.*; public class ArrowTest extends JPanel { private static final int PREF_W = 400; private static final int PREF_H = PREF_W; public ArrowTest() { setFocusable(true); requestFocusInWindow(); addKeyListener(new KeyAdapter() { @Override public void keyTyped(KeyEvent e) { myKeyEvt(e, "keyTyped"); } @Override public void keyReleased(KeyEvent e) { myKeyEvt(e, "keyReleased"); } @Override public void keyPressed(KeyEvent e) { myKeyEvt(e, "keyPressed"); } private void myKeyEvt(KeyEvent e, String text) { int key = e.getKeyCode(); System.out.println("TEST"); if (key == KeyEvent.VK_KP_LEFT || key == KeyEvent.VK_LEFT) { System.out.println(text + " LEFT"); //Call some function } else if (key == KeyEvent.VK_KP_RIGHT || key == KeyEvent.VK_RIGHT) { System.out.println(text + " RIGHT"); //Call some function } } }); } @Override public Dimension getPreferredSize() { return new Dimension(PREF_W, PREF_H); } private static void createAndShowGui() { ArrowTest mainPanel = new ArrowTest(); JFrame frame = new JFrame("ArrowTest"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(mainPanel); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } } 

Чтобы решить эту проблему, переопределите keyPressed, а не keyTyped, если вы хотите прослушивать события стрелок.

Или для еще лучшего решения: используйте Key Bindings

редактировать
Мое ключевое слово:

 import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import javax.swing.*; @SuppressWarnings("serial") public class ArrowTest extends JPanel { private static final int PREF_W = 400; private static final int PREF_H = PREF_W; public ArrowTest() { ActionMap actionMap = getActionMap(); int condition = JComponent.WHEN_IN_FOCUSED_WINDOW; InputMap inputMap = getInputMap(condition); for (Direction direction : Direction.values()) { inputMap.put(direction.getKeyStroke(), direction.getText()); actionMap.put(direction.getText(), new MyArrowBinding(direction.getText())); } } private class MyArrowBinding extends AbstractAction { public MyArrowBinding(String text) { super(text); putValue(ACTION_COMMAND_KEY, text); } @Override public void actionPerformed(ActionEvent e) { String actionCommand = e.getActionCommand(); System.out.println("Key Binding: " + actionCommand); } } @Override public Dimension getPreferredSize() { return new Dimension(PREF_W, PREF_H); } private static void createAndShowGui() { ArrowTest mainPanel = new ArrowTest(); JFrame frame = new JFrame("ArrowTest"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(mainPanel); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } } enum Direction { UP("Up", KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0)), DOWN("Down", KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)), LEFT("Left", KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0)), RIGHT("Right", KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0)); Direction(String text, KeyStroke keyStroke) { this.text = text; this.keyStroke = keyStroke; } private String text; private KeyStroke keyStroke; public String getText() { return text; } public KeyStroke getKeyStroke() { return keyStroke; } @Override public String toString() { return text; } } 
  • Как установить JFrame в центр, независимо от разрешения монитора?
  • Как заставить мои клавиши со стрелками ISO_Level5_Shift работать в графических интерфейсах Java Swing?
  • JTextArea не выбирается, но все еще отображается курсор «призрак»
  • Могу ли я иметь JTabbedPane с JMenuBar?
  • Интеграция JavaFX 2.0 WebView в приложение Swing Java SE 6
  • Несколько графиков на нескольких фигурах с использованием jFreeChart
  • JTable отключить флажок в ячейке
  • Ограничение строки JTable
  • Как установить значок в столбце JTable?
  • JPanel и компоненты меняются автоматически
  • Java: JProgressBar (или эквивалент) в заголовке вкладки JTabbedPane
  • Давайте будем гением компьютера.