【问题标题】:'<> is not abstract and does not override abstract method keyReleased' even though keyReleased is not used'<> 不是抽象的,并且不会覆盖抽象方法 keyReleased',即使没有使用 keyReleased
【发布时间】:2019-03-20 21:34:00
【问题描述】:

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

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

错误显示:&lt;anonymous DisplayerDeluxe$1&gt; is not abstract and does not override abstract method keyReleased(java.awt.event.KeyEvent) in java.awt.event.KeyListener

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

【问题讨论】:

  • 无论你是否使用它们,你都需要覆盖类中的所有三个方法。 keyPressed(KeyEvent e) void keyReleased(KeyEvent e) void keyTyped(KeyEvent e) 。这是因为您使用的是 KeyListener 接口。
  • 谢谢!我没有意识到所有的方法都必须被覆盖!过去一个小时一直让我头疼!

标签: java keylistener keyevent


【解决方案1】:

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

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

不使用其他类的解决方案是实现其他两种方法。由于您对它们没有所需的功能,因此您可以将它们留空并且什么也不做。大多数 IDE 实际上应该可以帮助您,因为当您开始创建匿名内部类时,它们会提示为您生成未实现的方法。

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

【讨论】:

    【解决方案2】:

    改用 KeyAdapter。它有内置的存根。

    bRef[i][j].addKeyListener(new KeyAdapter()...
    

    【讨论】:

      猜你喜欢
      • 2014-01-30
      • 2013-09-06
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多