它不是抽象的,不会覆盖抽象方法

为什么我从下面的代码中收到此编译错误消息?

(程序根据键盘上按下的箭头键在4个方向上移动箭头:d)

Direction.java:41:错误:DirectionPanel.DirectionListener不是抽象的,并且不会覆盖KeyListener中的抽象方法keyReleased(KeyEvent)

private class DirectionListener implements KeyListener { //Direction.java import javax.swing.*; import javax.swing.JFrame; import java.awt.*; import java.awt.event.*; class DirectionPanel extends JPanel { private final int WIDTH = 300, HEIGHT = 200; private final int JUMP = 10; //increment for image movement private final int IMAGE_SIZE = 31; private ImageIcon up, down, right, left, currentImage; private int x, y; //constructor: public DirectionPanel () { addKeyListener (new DirectionListener()); x =WIDTH / 2; y = HEIGHT / 2; up = new ImageIcon ("arrowUp.gif"); down = new ImageIcon ("arrowDown.gif"); left = new ImageIcon ("arrowLeft.gif"); right = new ImageIcon ("arrowRight.gif"); currentImage = right; setBackground (Color.black); setPreferredSize (new Dimension(WIDTH, HEIGHT)); setFocusable(true); } //draws public void paintComponent (Graphics page) { super.paintComponent (page); currentImage.paintIcon (this, page, x, y); } //represents the listener for keyboard activity private class DirectionListener implements KeyListener { public void keyPressed (KeyEvent event) { switch (event.getKeyCode()) { case KeyEvent.VK_UP: currentImage = up; y -= JUMP; break; case KeyEvent.VK_DOWN: currentImage = down; y += JUMP; break; case KeyEvent.VK_LEFT: currentImage = left; x -= JUMP; break; case KeyEvent.VK_RIGHT: currentImage = right; x += JUMP; break; } repaint(); } //empty definitions for unused methods private void KeyTyped (KeyEvent event) {} private void KeyReleased (KeyEvent event) {} } } public class Direction { public static void main (String[] args) { JFrame frame = new JFrame ("Direction"); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.getContentPane().add (new DirectionPanel()); frame.pack(); frame.setVisible(true); } } 

错误消息是

 DirectionPanel.DirectionListener is not abstract and does not override abstract method keyReleased(KeyEvent) in KeyListener private class DirectionListener implements KeyListener 

很明显,你的类不会覆盖它需要的所有方法,例如keyReleased 。 如果你看你的class级,你有KeyReleased ,它是private

重命名这些

 private void KeyTyped (KeyEvent event) {} private void KeyReleased (KeyEvent event) {} 

to keyTypedkeyReleased (注意小写k )并将它们public因为Java不允许子类型降低override方法的可见性。 然后用@Override注释每个。

如果没有实际覆盖,则使用@Override注释方法会导致编译错误。 JLS第9.6.1.4节说:

注释类型覆盖支持早期检测此类问题。 如果使用注释@Override注释方法声明,但该方法实际上不会覆盖超类中声明的任何方法,则会发生编译时错误。

添加到@Sotirios Delimanolis的答案是正确的,你可能想看看使用Keybindings而不是使用有两个大问题的keyListener,它会监听所有键和组件必须是可聚焦和焦点。

另一件事(如果您仍然想使用keyListeners)您可能希望扩展KeyAdapter ,它提供KeyListener方法的默认实现(空方法),因此您不需要覆盖您不使用的方法,如keyReleasedkeyTyped

例:

  private class DirectionListener extends KeyAdapter { @Override public void keyPressed (KeyEvent event) { switch (event.getKeyCode()) { case KeyEvent.VK_UP: currentImage = up; y -= JUMP; break; case KeyEvent.VK_DOWN: currentImage = down; y += JUMP; break; case KeyEvent.VK_LEFT: currentImage = left; x -= JUMP; break; case KeyEvent.VK_RIGHT: currentImage = right; x += JUMP; break; } repaint(); } }