KeyListener не обнаруживает нажатие клавиши

#java #keyboard #keylistener #keyevent

#java #клавиатура #keylistener #keyevent

Вопрос:

У меня есть созданная игра, и я хочу иметь возможность приостанавливать игру при нажатии клавиши P. Однако, пока игра запущена KeyListener , похоже, что она не обнаруживает, что клавиша P была нажата.

Правильный ли мой код? Я поместил addKeyListener в нужное место?

Есть похожие вопросы по SO, однако все они, похоже, используют JFrame , тогда как я использую графическую библиотеку ACM. Не уверен, имеет ли это какое-то значение.

Основной игровой цикл:

 @Override
public void run() {

    addKeyListener(new MyKeyListener());

    displayStartScreen();
    displayUI();
    drawBricks(getWidth() / 2.0, BRICK_Y_OFFSET);
    drawPaddle();

    while (lives > 0) {

        drawBall();
        playGame(); // additional game loop

        if (brickCounter == 0) {
            removeAll(); // removes all game objects
            displayUI();
            drawBricks(getWidth() / 2.0, BRICK_Y_OFFSET);
            drawPaddle();
            brickCounter = 100;
            }
        }
    } 
    if (brickCounter > 0) {
        removeAll();
        printGameOver();
    }
}
 

Дополнительный игровой цикл:

 private void playGame() {

    getBallVelocity();

    while (true) {

        moveBall();
        updateUI();

        if (ball.getY() >= getHeight()) {
            lives--;
            break;
        }
        if (brickCounter == 0) {
            break;
        }
    }
}
 

Класс KeyListener:

 private class MyKeyListener implements KeyListener {

    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_P) {
            System.out.println("Key 'P' has been pressed!"); // test
        }
    }

    @Override
    public void keyReleased(KeyEvent e) { /* Empty body */ }

    @Override
    public void keyTyped(KeyEvent e) { /* Empty body */ }
}
 

Комментарии:

1. Ваш код выглядит нормально. Получает ли acm.grachics (что бы это ни было) нажатия клавиш? Нужен ли фокус? Вы пробовали использовать JFrame для проверки вашего кода?

2. Является ли addKeyListener методом, предоставляемым вашей библиотекой? Назначаете ли вы слушателя правильному компоненту?

3. @ItFreak это было, однако я написал это неправильно, и IDE не уловила этого

Ответ №1:

Исправлена проблема. Код

 addKeyListener(new MyKeyListener());
 

неверно, оно должно быть

 addKeyListeners(new MyKeyListener());