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

}

私のCanvasサブクラス...

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 に答える