簡體   English   中英

為什么我的畫布不起作用?

[英]Why isn't my canvas working?

我正在創建游戲畫布,但由於某種原因我無法使其正常工作。 我收到一個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)
java.lang.IllegalStateException: Component must have a valid peer

這可能是由於您在調用createBufferStrategy()必須隱藏組件createBufferStrategy()

更新:

正如@Andrew所建議的那樣,您要混合輕量級和重量的組件。依靠默認的BufferStrategy。我們可以看到,直到將Canvas添加到Frame之前, Canvas才是不可顯示的。

在幀初始值設定項中,您的情況是:

public GameCanvas(Dimension size) {...}

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

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

然后在您的代碼后面,您想要包含代碼:

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

這只是通知框架您要此類使用緩沖區。 當框架不知道要用於請求的任務的組件的緩沖區時,您正在嘗試使框架使用緩沖區來創建圖形類型的緩沖區策略。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM