即使未使用keyReleased,“ <>也不是抽象的,并且不会覆盖抽象方法keyReleased”

时间:2018-10-16 11:02:14

标签: 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表示法。任何对此的见识将不胜感激!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

KeyListener是一个接口,实现程序的实现者可以提供3种方法。这意味着实现该接口的所有类(包括匿名内部类)都必须是抽象的(因此不必提供实现)或带有提供的实现的具体/普通类。匿名内部类始终是具体的,永远都不抽象,因此必须始终实现所需的所有方法。

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

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