I have a class extending JPanel and implementing a KeyListener. For some reason, the KeyListener does not respond to keys being pressed or released until I hit the TAB key once. I assume that the panel doesn’t have focus for some reason, which I thought setFocusable(true); and requestFocus(); would fix. What am I doing wrong?
EDIT: I placed requestFocus() in the updateGame() method and now it works. The updateGame() method is being called from an outside class that’s extending JFrame (where my game loop is). Is this solution “ok”, or should I make it some other way?
package tw;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.JPanel;
/**
* .
*/
public class GameBoard extends JPanel implements KeyListener {
private Tank tank;
public GameBoard() {
// Setup panel
setFocusable(true);
requestFocus();
setBackground(Color.WHITE);
setDoubleBuffered(true);
setSize(GameServer.W_WIDTH, GameServer.W_HEIGHT);
addKeyListener(this);
//setFocusTraversalKeysEnabled(false);
// Initialize entities
tank = new Tank(1, true, 200, 100, 1);
}
/**
* Update game logic
*/
public void updateGame() {
//System.out.println("updating");
tank.update();
}
/**
* Draw game objects
*/
public void paintComponent(Graphics g) {
super.paintComponent(g);
//System.out.println("drawing");
tank.draw(g);
Toolkit.getDefaultToolkit().sync();
g.dispose();
}
// Handling key input
/////////////////////////////////////////////
/**
* Key input - when key is pressed.
*/
public void keyPressed(KeyEvent e) {
System.out.println("KEY PRESSED!");
tank.keyPressed(e);
}
/**
* Key input - when key is released.
*/
public void keyReleased(KeyEvent e) {
System.out.println("KEY RELEASED!");
tank.keyReleased(e);
}
public void keyTyped(KeyEvent e) {
// do nothing
}
}