java - '<> 不是抽象的,即使不使用 keyReleased,也不会覆盖抽象方法 keyReleased'

标签 java keylistener keyevent

我在创建此类时收到两个错误。第一个出现在:

public class DisplayerDeluxe extends JPanel implements ActionListener, 
KeyListener{

显示以下编译器错误:DisplayerDeluxe is not abstract and does not override abstract method keyReleased(java.awt.event.KeyEvent) in java.awt.event.KeyListener

此处显示下一个错误

public void startGame() {
        paintCurrent(0, 0);
        for(int i = 0; i < height; i++) {
            for(int j = 0; j < width; j++) {
                bRef[i][j].addKeyListener(new KeyListener() { //Error is shown here
                        @Override public void keyPressed(KeyEvent e) {
                            mazeBuilder.buildPath();
                            Grid grid = mazeBuilder.getGrid();
                            if(e.getKeyCode() == KeyEvent.VK_UP && getYPos() != 0
                            && !getCell(getXPos(), getYPos(), grid).hasNorth()) {
                                moveUp();
                            }
                            else if(e.getKeyCode() == KeyEvent.VK_DOWN && getYPos() != height - 1
                            && !getCell(getXPos(), getYPos(), grid).hasSouth()) {
                                moveDown();
                            }
                            else if(e.getKeyCode() == KeyEvent.VK_LEFT && getXPos() != 0
                            && !getCell(getXPos(), getYPos(), grid).hasWest()) {
                                moveLeft();
                            }
                            else if(e.getKeyCode() == KeyEvent.VK_RIGHT && getXPos() != width - 1
                            && !getCell(getXPos(), getYPos(), grid).hasEast()) {
                                moveRight();
                            }
                            else {
                                infoBox("Only arrow key input in a dirrection " +
                                    "not blocked by a wall is valid.", "Maze Game");
                            }
                        }
                    });
            }
        }
        infoBox("Welcome to the maze game! Navigate your way to the end by using the arrow keys!", "Maze Game");
    }

错误内容为:<anonymous DisplayerDeluxe$1> is not abstract and does not override abstract method keyReleased(java.awt.event.KeyEvent) in java.awt.event.KeyListener

这让我非常困惑,因为我的代码中没有任何地方包含 keyReleased() 和 keyPressed() 有 @Override 符号。任何对此的见解将不胜感激!

最佳答案

当您声明new KeyListener() { ... }时您正在创建所谓的匿名内部类,该类扩展 KeyListener并创建它的未命名实例(因此是匿名的)。该错误提示您的匿名内部类,显示为 <anonymous DisplayerDeluxe$1> ,既不是抽象的,也没有实现方法 keyReleased(java.awt.event.KeyEvent)java.awt.event.KeyListener中所述.

KeyListener是一个接口(interface),它要求实现者提供 3 个方法。这意味着实现此接口(interface)的所有类(包括匿名内部类)必须是抽象的(因此没有义务提供实现)或提供了实现的具体/普通类。匿名内部类始终是具体的,而不是抽象的,因此必须始终实现所需的所有方法。

解决这个问题的方法是在不使用其他类的情况下实现其他两个方法。由于您没有为它们提供所需的功能,因此您可以将它们留空而不执行任何操作。大多数 IDE 实际上应该帮助您完成此任务,因为当您开始创建匿名内部类时,它们会提示为您生成未实现的方法。

或者,您可以扩展另一个类,该类可能已经使用 stub 实现了部分或全部这些方法,例如 KeyAdapter ,但最终所有方法都必须以某种方式实现。

关于java - '<> 不是抽象的,即使不使用 keyReleased,也不会覆盖抽象方法 keyReleased',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52833967/

相关文章:

android - 如何处理 Android 应用程序中主页按钮的 KeyEvent?

java - JAXB 无法识别类型继承

java - JPA 2.1 外键未在 ManyToOne 级联上保存

java - 在Java中组合多个列表

java - 来自 JFrame 的 JDialog,为什么我的听众不起作用?

java - 在背景框架上使用 Java KeyListener

java - Java/Groovy 中的 Base64 编码

java - 如何用方向键移动矩形?

java - 需要在swing小程序中禁用F10键的Frame Focus

java - 在后台停止java程序