KeyListener в JPanel не получает никаких ключевых событий - PullRequest
0 голосов
/ 05 мая 2018

Я создаю игру, и когда я вводил пользовательский ввод, я столкнулся с этой проблемой. Я добавляю 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());
}

}

1 Ответ

0 голосов
/ 05 мая 2018

Проблема решена Мне нужно запросить фокус после того, как JPanel добавлен в JFrame и станет видимым.

...