I\'m having trouble with the default Java KeyListener in my project. I noticed that the KeyListener doesn\'t seem to get KeyEvents forwarded sometimes when I start.
Try adding a JButton to your "canvas" JPanel, then pressing the button and seeing what happens to your KeyListener -- it fails because the JPanel lost the focus. To prevent this from happening, use Key Bindings instead (see the link in my comment above for the tutorial). For e.g.,
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class Game2 {
private static final String UP = "up";
public static void main(String[] args) {
new Game2();
}
public Game2() {
JFrame window = new JFrame("Press up-arrow key");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel canvas = new JPanel();
canvas.setPreferredSize(new Dimension(400, 300));
window.add(canvas);
canvas.add(new JButton(new AbstractAction("Press space-bar") {
public void actionPerformed(ActionEvent e) {
System.out.println("Button or space-bar pressed");
}
}));
ActionMap actionMap = canvas.getActionMap();
int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
InputMap inputMap = canvas.getInputMap(condition);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), UP);
actionMap.put(UP, new UpAction());
window.pack();
window.setLocationRelativeTo(null);
window.setVisible(true);
}
}
@SuppressWarnings("serial")
class UpAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("Up Arrow pressed!");
}
}