Я пытаюсь сделать простую анимацию с помощью ActionListener
и KeyListener
, которые будут принимать в входах клавиатуры, а именно клавиши со стрелками. Проблема в том, что программа не компилируется с помощью KeyListener
. Может кто-то пролить свет на то, почему и, возможно, помочь с решением. Благодарю!
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Planegame extends JPanel implements ActionListener, KeyListener
{ //^^ this line is giving me trouble^^^^
Timer tim = new Timer(20, this);
int x = 0, y = 0, velX = 0, velY = 0;
public Planegame()
{
tim.start(); //this will start my animation
addKeyListener(this); // will activate the keylistner to watch key press
setFocusable(true);
setFocusTraversalKeysEnabled(false); //disables shift and tab key
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.GREEN);
g.fillOval(x, y, 10, 10);
}
public void actionPerformed(ActionEvent e)
{
x = x + 10; //velX
y = y + velY;
repaint();
}
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==38)
{
velY = 1;
}
if(e.getKeyCode()==40)
{
velY = -1;
}
if (e.getKeyCode()==32) //booster power
{
velX = 3;
}
}
public void keyTyped(KeyEvent e) {}
public void keyReleased(keyEvent e) {}
public static void main(String[] args)
{
PlaneGame zed = new PlaneGame();
JFrame k = new JFrame();
k.setTitle("game");
k.setSize(600,400);
k.setVisible(true);
k.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
k.add(zed);
}
}
У вас есть опечатка в объявлении метода keyReleased
...
public void keyReleased(keyEvent e) {
Помните, что Java чувствительна к регистру, это должно быть...
public void keyReleased(KeyEvent e) {
Обратите внимание на верхний регистр K
в KeyEvent
Вы хотите использовать аннотацию @Override
для методов, которые, по вашему мнению, вы переопределяете, это предупредит вас, когда вы допустили какую-либо ошибку, например
@Override
public void keyReleased(KeyEvent e) {
Также нет причин, по которым paintComponent
должен быть public
, вы никогда не хотите, чтобы кто-то за пределами вашего компонента вызывал его
Как всегда, я бы посоветовал использовать привязки клавиш по KeyListener
поскольку они обеспечивают лучший контроль над уровнем фокуса, который ваш компонент должен иметь, чтобы вызвать ключевое событие
Planegame
должен также@Override .. getPreferredSize()
возвращать 600x400. Тогда вместоk.setSize(600,400);
, просто добавьте игру с самолетом иk.pack()
. Легко сделано. Размер игры точно соответствует размеру, и мы не знаем и не заботимся о том, насколько большой кадр, а просто о том, что это правильный размер, необходимый для отображения контента.e.getKeyCode()==32
Не используйте магические числа. Волшебство может сломаться на другой JVM или на следующей версии. Для кодов ключей определены константы (которые работают надежно во всех JVM).