0

我正在创建一个游戏画布,但由于某种原因我无法让它正常工作。我得到一个 InvalidStateException ,但我不知道是什么原因造成的。任何人都可以解释一下吗?

我的主要入口点...

public class GameTemplate {

    public static void main(String[] args) {
        new GameFrame();
    }

}

我的 JFrame 子类...

import java.awt.Dimension;

import javax.swing.JFrame;

public class GameFrame extends JFrame {


    public static final short WIDTH = 1024;
    public static final short HEIGHT = WIDTH / 16 * 9;
    public static final Dimension size = new Dimension(WIDTH, HEIGHT);

    public GameFrame() {
        super("Game Frame");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(size);
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        GameCanvas canvas = new GameCanvas(size);
        this.add(canvas);
        canvas.start();
        this.setVisible(true);
    }

}

我的画布子类...

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferStrategy;

public class GameCanvas extends Canvas implements Runnable {

    private boolean isRunning = false;
    private Thread thread = null;

    private BufferStrategy bs = null;
    private Graphics g;
    private Graphics2D g2d;

    public GameCanvas(Dimension size) {
        this.setSize(size);
        this.setVisible(true);
    }

    public synchronized void start() {
        isRunning = true;
        thread = new Thread(this);
        thread.start();
    }

    public synchronized void stop() {
        isRunning = false;
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (isRunning) {
            update();
            draw();
            render();
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private void update() {

    }

    private void render() {
        bs = this.getBufferStrategy();
        if (bs == null) {
            this.createBufferStrategy(3);
            return;
        }
        bs.show();
    }

    private void draw() {
        if (bs != null) {
            g = bs.getDrawGraphics();
            g2d = (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            g.setColor(Color.BLACK);
            g.drawRect(0, 0, WIDTH, HEIGHT);
        }
    }

}

错误...

Exception in thread "Thread-1" java.lang.IllegalStateException: Component must have a valid peer
at java.awt.Component$FlipBufferStrategy.createBuffers(Unknown Source)
at java.awt.Component$FlipBufferStrategy.<init>(Unknown Source)
at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Unknown Source)
at java.awt.Component.createBufferStrategy(Unknown Source)
at java.awt.Canvas.createBufferStrategy(Unknown Source)
at java.awt.Component.createBufferStrategy(Unknown Source)
at java.awt.Canvas.createBufferStrategy(Unknown Source)
at GameCanvas.render(GameCanvas.java:63)
at GameCanvas.run(GameCanvas.java:47)
at java.lang.Thread.run(Unknown Source)
4

2 回答 2

1
java.lang.IllegalStateException: Component must have a valid peer

这可能是您调用createBufferStrategy()组件时必须隐藏的原因。

更新:

正如@Andrew 所建议的那样,您正在混合轻型和重型组件。依赖默认的 BufferStrategy。正如我们所见,Canvas在您将其添加到Frame.

于 2013-01-20T07:08:13.457 回答
0

在框架初始化程序中,在您的情况下:

public GameCanvas(Dimension size) {...}

您需要调用方法“frame.addNotify()”,例如:

 public GameCanvas(Dimension size) {
    this.setSize(size);
    this.setVisible(true);
    this.addNotify();
 }

然后稍后在您的代码中,您想要包含代码:

@Override
public void addNotify() {
    super.addNotify();
}

这只是通知框架您希望此类使用缓冲区。当框架不知道要为请求的任务使用哪个组件的缓冲区时,您在哪里做的是试图让框架使用缓冲区来创建图形类型缓冲区策略。

于 2015-01-06T15:33:58.310 回答