Я проверил код и могу помочь вам устранить ошибки.
Во-первых, здесь вы показали, что Paddle использует метод paint () JFrame Pong . Вы обнаруживаете клавиши 'W' и 'S' и в соответствии с ключом, который вы написали код, чтобы обновить координату y в классе Paddle.
Но проблема в том, что вы Вы просто обновляете координату y. Вы больше не рисуете весло с новыми координатами. Итак, после установки нового значения y, вы должны снова нарисовать весло. Итак, в методе keyPressed () после
this.paddle1.up();
и
this.paddle1.down();
вы должны снова вызвать метод draw () класса Paddle, который будет рисовать Paddle в измененном location.
В этом методе draw () вы передаете объект Graphics, который является графической конфигурацией текущего JFrame Pong. Таким образом, это можно получить с помощью метода getGraphics () JFrame.
Итак, строка, которую нужно добавить после up () или down (), будет
this.paddle1.draw(getGraphics());
Поскольку мы имеем дело с графикой это также правильно перекрасить JFrame, как только вы измените что-то в его графике. Если вы добавили только вышеприведенную строку после метода up () и down () в методе keyPressed (), вы увидите, что манипулятор не движется. Его предыдущий рисунок будет таким, какой он есть, и, согласно нажатой клавише, новый Paddle будет нарисован вверх или вниз. Таким образом, вместо подвижного весла вы увидите вертикальную черту. Это происходит потому, что мы модифицируем графику, но не рисуем JFrame снова. Таким образом, он просто добавит новый прямоугольник в JFrame, сохранив прежний. Итак, чтобы избавиться от этого, вы должны использовать метод repaint () JFrame, чтобы он вызывал aws только самый последний экран.
Итак, полный метод keyPressed () будет выглядеть так:
@Override
public void keyPressed(KeyEvent keyEvent) {
int key = keyEvent.getKeyCode();
if (key == KeyEvent.VK_ESCAPE) {
this.dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
} else if (key == KeyEvent.VK_W) {
this.paddle1.up();
this.paddle1.draw(getGraphics());
repaint();
} else if (key == KeyEvent.VK_S) {
this.paddle1.down();
this.paddle1.draw(getGraphics());
repaint();
}
}
Итак, теперь, после обнаружения правильных клавиш, он снова рисует весло, а затем отбрасывает и предыдущие, так что, пока вы будете запускать этот код, вы сможете увидеть, что весло движется как за нажатую клавишу.
Теперь об исключении NullPointerException. Я пытался запустить этот код, но я не смог воспроизвести такое исключение. Итак, после попытки предложенного кода, если вы столкнулись с NPE, вы можете обновить трассировку стека, чтобы решить ее.
Я прочитал комментарии, и они очень полезны. Проверьте ссылку, которая объясняет лучший способ прослушивания ключевых событий.
Спасибо.