【问题标题】:Main.GamePanel is not abstract and does not override abstract method keyReleased(java.awt.event.KeyEvent) in java.awt.event.KeyListenerMain.GamePanel 不是抽象的,不会覆盖 java.awt.event.KeyListener 中的抽象方法 keyReleased(java.awt.event.KeyEvent)
【发布时间】:2013-09-06 04:19:05
【问题描述】:

我在网上做一个教程,因为我想制作一个 2d 横向卷轴,我得到了这个确切的错误。我已经用谷歌搜索了它,但一无所获。我试着寻找一个错字,它看起来很干净,它不会给我任何代码中的错误。我不知道从哪里开始。如果您能向我解释错误是什么以及我如何解决它,那就太棒了。

    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());
        }




    }

【问题讨论】:

标签: java swing awt keylistener


【解决方案1】:

编译器错误消息准确地告诉您出了什么问题:您的类实现了 KeyListener 接口,但没有实现该接口的所有必要方法。解决方案:确保按照 KeyListener API 实现所有必要的方法。还要确保使用 @Override 注释以确保您的覆盖正确。

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

【讨论】:

    【解决方案2】:

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

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

    当你想要覆盖一个超级方法时,还要在方法中添加@Override 注释(正如@Hovercraft Full Of Eels 所建议的那样)。这样 IDE 会在编码时为您提供提示。

    【讨论】:

      猜你喜欢
      • 2014-01-30
      • 2019-03-20
      • 1970-01-01
      • 2014-06-20
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多