Проблема с KeyListener в анимации

1

Я пытаюсь сделать простую анимацию с помощью 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);
}
}
  • 0
    Кстати, Planegame должен также @Override .. getPreferredSize() возвращать 600x400. Тогда вместо k.setSize(600,400); , просто добавьте игру с самолетом и k.pack() . Легко сделано. Размер игры точно соответствует размеру, и мы не знаем и не заботимся о том, насколько большой кадр, а просто о том, что это правильный размер, необходимый для отображения контента.
  • 0
    e.getKeyCode()==32 Не используйте магические числа. Волшебство может сломаться на другой JVM или на следующей версии. Для кодов ключей определены константы (которые работают надежно во всех JVM).
Теги:
swing
animation
compiler-errors
keylistener

1 ответ

5

У вас есть опечатка в объявлении метода keyReleased...

public void keyReleased(keyEvent e) {

Помните, что Java чувствительна к регистру, это должно быть...

public void keyReleased(KeyEvent e) {

Обратите внимание на верхний регистр K в KeyEvent

Вы хотите использовать аннотацию @Override для методов, которые, по вашему мнению, вы переопределяете, это предупредит вас, когда вы допустили какую-либо ошибку, например

@Override
public void keyReleased(KeyEvent e) {

Также нет причин, по которым paintComponent должен быть public, вы никогда не хотите, чтобы кто-то за пределами вашего компонента вызывал его

Как всегда, я бы посоветовал использовать привязки клавиш по KeyListener поскольку они обеспечивают лучший контроль над уровнем фокуса, который ваш компонент должен иметь, чтобы вызвать ключевое событие

  • 0
    Спасибо, вау, это была действительно основная ошибка. В следующий раз я буду уделять больше внимания. Голосуй за тебя ^^^^
  • 1
    @AndrewThompson Согласен, это вызвало бы еще одну ошибку компилятора;)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню