java - Main.GamePanel 不是抽象的,不会重写 java.awt.event.KeyListener 中的抽象方法 keyReleased(java.awt.event.KeyEvent)

标签 java swing awt keylistener

我正在网上做一个教程,因为我想制作一个 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());
        }




    }

最佳答案

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

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

关于java - Main.GamePanel 不是抽象的,不会重写 java.awt.event.KeyListener 中的抽象方法 keyReleased(java.awt.event.KeyEvent),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18583674/

相关文章:

java - 如何获取 jTabbedpane 中文本区域的名称?

java - java Applet 有哪些限制?

java - 为什么不推荐使用 java getPeer 调用?

java - 需要帮助理解两个 java gui 相关系统属性的影响

java - Parallel Stream 给出空项,如何在 Java 8 中执行

java - JSF 表达式语言的代码风格指南

java - JLabel 或 JPanel 的 createTransferable 不会触发

java - 如何在 Android 应用程序中打印消息

java - Magic Square 程序帮助 (Java)

java - 远程 JVM 机器人调用