Я пытаюсь что-то сделать, когда одна из клавиш со стрелками нажата с помощью KeyListener в моем классе JPanel. Вот мой код:Keylistener не работает для JPanel
public class TestPanel extends JPanel implements KeyListener{
public TestPanel(){
this.addKeyListener(this);
this.setFocusable(true);
this.requestFocusInWindow();
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
System.out.println("Right");
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
System.out.println("Left");
}
}
public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}
}
Мой основной метод добавляет новый экземпляр этой панели к кадру и отображает его. Нужно ли добавлять ключевой список в JFrame? В моем случае это было бы сложно и неэффективно, поэтому я хотел бы, если возможно, работать с этим JPanel. Кто-нибудь знает, что я делаю неправильно?
EDIT: Сочетания клавиш код, который не работает, либо:
public class GamePanel extends JPanel implements ActionListener{
//Constructor
public GamePanel(){
setupKeyBinding();
this.setFocusable(true);
this.requestFocusInWindow();
}
private void setupKeyBinding() {
int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
InputMap inMap = getInputMap(condition);
ActionMap actMap = getActionMap();
inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "Left");
actMap.put("Left", new leftAction());
}
private class leftAction extends AbstractAction {
public void actionPerformed(ActionEvent e) {
System.out.println("test");
}
}
public void actionPerformed(ActionEvent e) {
//some other game info
}
}
Может кто-нибудь сказать мне, почему это не работает либо? (мой второй прослушиватель действий для других вещей, необходимых для моей игры)
Другой идеей может быть внутренний класс и использовать что-то вроде: this.addKeyListener (внутренний класс/анонимный внутренний класс); – ObedMarsh
Возможный дубликат [java keylistener not called] (http://stackoverflow.com/questions/8482268/java-keylistener-not-called) –