创建此类时,我收到两个错误。第一次出现在:
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表示法。任何对此的见识将不胜感激!
答案 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
)实现了某些或所有这些方法,但是最终所有方法都必须以一种或另一种方式实现。