Я создаю игру, и когда я вводил пользовательский ввод, я столкнулся с этой проблемой. Я добавляю KeyListener в JPanel, но он не работает вообще. Программа сделана из JPanel (GameWindow) внутри JFrame (WindowManager). Игра запускается в объекте GameLoop, который реализует Runnable. Уровень содержит всю информацию о том, как карта выглядит. Я прочитал, что KeyListener работает, если компонент является фокусируемым, поэтому я проверил, является ли панель фокусируемой, и программа вернула true. Может быть, это проблема, но я не знаю, почему.
public class GameWindow extends JPanel {
private Level level;
private GameLoop gameLoop;
private LevelLoader levelLoader = new LevelLoader();
private WindowManager windowParent; // A JFrame
public GameWindow(WindowManager windowParent){
super();
this.windowParent = windowParent;
setBackground(Color.BLACK);
gameLoop = new GameLoop(this);
level = levelLoader.loadLevel(1);
setFocusable(true);
requestFocusInWindow();
addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
System.out.println("typed");
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("pressed");
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("released");
}
});
start();
}
private void start(){
Thread thread = new Thread(gameLoop);
thread.start();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(600, 600);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D graphics2D = (Graphics2D) g;
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
level.paintLevel(g,getSize());
}
}