J'essaie de faire quelque chose quand l'une des touches fléchées est pressée en utilisant le KeyListener dans ma classe JPanel. Voici mon code:Keylistener ne fonctionne pas pour 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) {}
}
Ma principale méthode ajoute une nouvelle instance de ce panneau à un cadre et l'affiche. Ai-je besoin d'ajouter le keylistener au JFrame? Dans mon cas, cela serait difficile et inefficace, donc je voudrais que cela fonctionne avec ce JPanel si possible. Quelqu'un sait ce que je fais mal?
EDIT: Code clés qui ne Manchettes fonctionne pas non plus:
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
}
}
Quelqu'un peut-il me dire pourquoi ce travail ne marche pas non plus? (mon deuxième écouteur d'action est pour d'autres choses nécessaires pour mon jeu)
Une autre idée pourrait être de créer une classe interne et d'utiliser quelque chose comme: "this.addKeyListener (classe interne/classe interne anonyme);" – ObedMarsh
duplication possible de [java keylistener non appelé] (http://stackoverflow.com/questions/8482268/java-keylistener-not-called) –