Main.GamePanel不是抽象的,并且不会覆盖java.awt.event.KeyListener中的抽象方法keyReleased(java.awt.event.KeyEvent)

时间:2013-09-03 03:34:50

标签: java swing awt keylistener

我正在网上做一个教程,因为我想制作一个2d侧卷轴,我得到了这个确切的错误。我用Google搜索了它,但没有提出任何问题。我试着寻找一个拼写错误,它看起来很干净,它没有给我一个错误代码中的其他任何东西。我不知道从哪里开始。如果你能向我解释错误是什么以及我如何解决它,那将是惊人的。

    package Main;


import GameState.GameStateManager;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;

public class GamePanel extends JPanel implements Runnable, KeyListener{
    public static final int WIDTH = 320;
    public static final int HIGHT = 240;
    public static final int SCALE = 2;

    //game thread

    private Thread thread;
    private boolean running;
    private int FPS = 60;
    private long targetTime = 1000/FPS;
    //image        
    private BufferedImage image;
    private Graphics2D g;

    //game state manager
    private GameStateManager gsm;




    public GamePanel(){
        super();
        setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        setFocusable(true);
        requestFocus();
    }
    public void addNotify(){
        super.addNotify();
        if (thread == null) {
            thread = new Thread(this);
            addKeyListener(this);
            thread.start();
        }
    }   
    private void init() {
        image = new BufferedImage(WIDTH, HIGHT, BufferedImage.TYPE_INT_RGB);     
        g = (Graphics2D) image.getGraphics();
        running = true;
        gsm = new GameStateManager();

    }

        public void run(){
        init();
        long start, elapsed, wait;

        //game loop
          while(running) {

            start = System.nanoTime();
            update();
            draw();
            drawToScreen();
               elapsed = System.nanoTime() - start;

               wait = targetTime - elapsed / 1000000;

               try
               {
                   Thread.sleep(wait);
               }
               catch(Exception e) 
               {
                   e.printStackTrace();
               }//end of try catch
          }







        }
        private void update()
        {
            gsm.update();
        }
        private void draw()
        {
            gsm.draw(g);
        }
        private void drawToScreen()
        {
            Graphics g2 = getGraphics();
            g2.drawImage(image, 0, 0, null);
            g2.dispose();


        }




        public void KeyPressed(KeyEvent key) 
        {
         gsm.keyPressed(key.getKeyCode());
        }
        public void KeyReleased(KeyEvent key) 
        {
         gsm.keyReleased(key.getKeyCode());
        }




    }

2 个答案:

答案 0 :(得分:3)

编译器错误消息告诉您完全错误:您的类实现了KeyListener接口,但没有实现接口的所有必要方法。解决方案:确保按照KeyListener API实现所有必需的方法。另外,请务必使用@Override注释以确保覆盖正确。

话虽如此,我建议您使用KeyListeners进行Swing应用程序的大多数键盘输入,它是一个低级别的监听器,应该避免使用更高级别的结构,例如key bindings。此外,Swing GUI应该避免使用update(...)方法覆盖,因为这更像是一个AWT结构。

答案 1 :(得分:0)

您的KeyReleased(KeyEvent key)方法必须以小写字母'k'开头,例如keyReleased(KeyEvent key)。 Java区分大小写。

您可能还需要覆盖KeyListener接口的其他方法。

当您要覆盖超级方法时,还要将@Override注释(由@Hovercraft Full Of Eels建议)添加到方法中。这样,IDE会在编码时给你提示。