Keylistener not working for JPanel

user2373733 picture user2373733 · May 13, 2013 · Viewed 36.6k times · Source

I am trying to do something when one of the arrow keys are pressed using the KeyListener in my JPanel class. Here is my code:

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) {}
}

My main method adds a new instance of this panel to a frame and displays it. Do I need to add the keylistener to the JFrame? In my case, this would be difficult and inefficient, so I would like to make it work with this JPanel if possible. Anyone know what I am doing wrong?

EDIT: Key Bindings code that does not work either:

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
}
} 

Can someone tell me why this doesnt work either? (my second action listener is for other stuff needed for my game)

Answer

Hovercraft Full Of Eels picture Hovercraft Full Of Eels · May 13, 2013

If you search this problem, you'll see that it is asked and has been solved many times.

  • KeyListeners need to be on the focused component to work. One solution is to give your component the focus after first making it focusable.
  • Better by a long shot however is to use Key Bindings. Google the tutorial on this.

Please have a look at my answer to this question for more on this, including many of the gory details.