【问题标题】:public class extends JPanel公共类扩展JPanel
【发布时间】:2013-12-31 20:34:29
【问题描述】:

我收到一个类似这样的错误,

运行:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at ao.Game.main(Game.java:11)
Caused by: java.lang.RuntimeException: Uncompilable source code - 
   ao.Panel is not abstract and does not override abstract method     
   keyReleased(java.awt.event.KeyEvent) in java.awt.event.KeyListener
    at ao.Panel.<clinit>(Panel.java:15)
    ... 1 more
Java Result: 1
BUILD SUCCESSFUL (total time: 3 seconds)

我不知道公共课的问题是什么。

下面有 2 个单独的文件。 Game.java Panel.java

第一个文件:

package ao;

import ao.Panel;
import javax.swing.JFrame;

public class Game {

    public static void main(String[] args) {
        JFrame frame = new JFrame("2D Shooter Pre-Alpha");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new Panel());
        frame.pack();
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

下一个文件:

package ao;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;

/**
 *
 * @author andyoppenheimer
 */
public class Panel extends JPanel implements Runnable, KeyListener {

    // panel dimensions
    public static final int WIDTH = 320;
    public static final int HEIGHT = 240;
    public static final int SCALE = 2;
    // main loop
    private Thread thread;
    private boolean running = false;
    private int fps = 60;
    private long targetTime = 1000 / fps;
    // drawing
    private Graphics2D g;
    private BufferedImage image;

    public Panel() {
        setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        setFocusable(true);
        requestFocus();
    }

    public void addNotify() {
        super.addNotify();
        if (thread == null) {
            running = true;
            addKeyListener(this);
            thread = new Thread(this);
            thread.start();
        }
    }

    public void init() {

        image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        g = (Graphics2D) image.getGraphics();

    }

    public void update() {
    }

    public void draw() {
        g.clearRect(0, 0, WIDTH, HEIGHT);
    }

    public void drawToScreen() {
        Graphics g2 = getGraphics();
        g2.drawImage(image, 0, 0, WIDTH * SCALE, HEIGHT * SCALE, null);
        g2.dispose();
    }

    public void run() {

        init();

        long start;
        long elapsed;
        long wait;

        while (running == true) {
            start = System.nanoTime();

            update();
            draw();
            drawToScreen();

            elapsed = System.nanoTime() - start;
            wait = targetTime - elapsed / 1000000;

            if (wait < 0) {
                wait = 5;
            }
            try {
                Thread.sleep(wait);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

    }

    public void KeyPressed(KeyEvent k) {
    }

    public void KeyReleased(KeyEvent k) {
    }

    public void KeyTyped(KeyEvent k) {
    }
}

【问题讨论】:

  • g = (Graphics2D) image.getGraphics(); 啊啊啊!无论您使用什么资源来学习 Java,都将其丢失。这是垃圾。而是转到Performing Custom Painting.. 对于 Swing,通常在基于 AWT 的较低级别 KeyListener 上使用键绑定。有关如何使用它们的详细信息,请参阅How to Use Key Bindings。此外,尝试实际阅读该组。这类事情一天会出现 2-3 次!
  • @AndrewThompson 您能否评论一下更好的方法以及为什么那行代码让您如此厌恶?
  • @KevinBowersox 查看编辑。
  • @AndrewThompson 您可以发表评论作为答案:)
  • @nachokk 不幸的是,它甚至没有开始解决编译问题。我认为这已经处理得很好了。

标签: java class compiler-errors jpanel extends


【解决方案1】:

在 java 中,方法以小写 keyTyped keyReleasedkeyPressed 开头,因此您不会覆盖 KeyListener 方法。

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

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

您的类定义将导致可能的潜在错误

public class Panel extends JPanel implements Runnable, KeyListener

调用Panel 令人困惑,因为 java.awt.Panel 已经存在,所以叫它不同。像这样实现多个接口会破坏 Single Responsability Principle 。一个可能的解决方案是创建内部类或匿名类。如果你不重写一个方法,那么肯定不需要扩展JPanel。请注意,如果您使用KeyListener,则组件必须处于焦点且可聚焦并将其绑定到所有键,而您可以使用KeyBindings。不要使用requestFocus,而是使用requestFocusInWindow(),如果你读过api,它会说不鼓励。

【讨论】:

  • 谢谢你,我今天感觉很笨,不得不在飞机上写这个。 :)
  • @RC。为什么没有答案?
  • 这就是答案,我只是说我犯了这个错误我觉得很愚蠢。
【解决方案2】:

该类实现了KeyListener 接口,但不提供接口上指定的keyReleasedkeyPressedkeyTyped 方法的实现。相反,它为KeyReleasedKeyPressedKeyTyped 提供了未正确大小写的实现。

【讨论】:

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