【问题标题】:It's not abstract does not override abstract method它不是抽象的,不会覆盖抽象方法
【发布时间】:2014-01-16 03:26:52
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您对错误信息有什么不明白的地方?这很清楚。字符大小写在 Java 中很重要,但您也不能降低方法的可见性。
  • 啊哈哈,你非常'在球'Sotirios:我现在已经编译了但我不知道你所说的'降低方法的可见性'是什么意思-虽然(我可能应该开始一个新的问题)它现在编译,当我运行它时,我和我在黑屏上单击鼠标,我什么也看不到。代码是否还有其他问题,或者是我的鼠标有问题,因为它也发生在我尝试的最后一个 GUI 项目中。
  • 如果接口将方法声明为public,则不能在子类型中使用private
  • 好吧,我做了 keyTyped 和 keyReleased pulic

标签: java swing keylistener


【解决方案1】:

错误信息是

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

显然你的类并没有覆盖它需要的所有方法,例如keyReleased。如果你查看你的班级,你有KeyReleased,它是private

重命名

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

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

@Override 注释一个方法,如果它实际上没有覆盖,会导致编译错误。 Section 9.6.1.4 of the JLS 说:

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

【讨论】:

  • 如果一个用@Override注解的方法确实not覆盖了你会得到一个编译错误(不仅仅是一个“提示”)
  • 好的,谢谢大家。我现在已经编译好了。只是运行时看不到面板上的箭头?
  • @user3142706 我对摇摆不太了解。在这方面我帮不了你。
  • @user3142706 这个答案是正确的,但是看看我的答案也许对你有帮助!
  • 是的。为你的答案添加了特殊的酱汁:)
【解决方案2】:

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

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

例子:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多