'<> is not abstract and does not override abstract method keyReleased'即使未使用密钥发布



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

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

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

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

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

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

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

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

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

相关内容

最新更新