簡體   English   中英

創建新的Bufferstrategy時出現非法狀態異常

[英]Illegal State Exception when creating new Bufferstrategy

當我試圖弄清楚如何使用緩沖區策略時,整體上只是改進了我編寫代碼和清理內容的方式。 當我運行以下代碼時,我在“createBufferStrategy(3)”時出錯

    package Game1Test;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.io.IOException;

import javax.swing.*;

public class Base extends Canvas implements Runnable{

    private static final long serialVersionUID = 1L;
    private boolean running = false;
    int ticks = 0;

    public Base(JFrame f) {
        setSize(f.getWidth(),f.getHeight());
        start();
    }

    public void start(){
        running = true;
        new Thread(this).start();
    }
    public void stop(){

    }
    public void run(){
        while(running){
            ticks++;
            System.out.println(ticks);
            render();

                try {
                    Thread.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
        }
    }
    public void render(){
        BufferStrategy bs = getBufferStrategy();
        Graphics g;
        if(bs == null){
            createBufferStrategy(3);
            requestFocus();
            return;
        }
        bs.show();
    }



}

然后添加基地:

package Game1Test;

import java.awt.*;

import javax.swing.JFrame;

public class Screen extends JFrame{

    public final int GAME_WIDTH = 400;
    public final int GAME_HEIGHT = 400;
    public Dimension gameDim = new Dimension(GAME_WIDTH,GAME_HEIGHT);
    final String gameName = "Test";

    public Screen(){
        setSize(gameDim);
        setTitle(gameName);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setLayout(new GridLayout());
        setVisible(true);
        setLocationRelativeTo(null);
    }
    public static void main(String[] args){
        Screen s = new Screen();
        s.add(new Base(s));
    }
}

我收到以下錯誤:

Exception in thread "Thread-2" 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 Game1Test.Base.render(Base.java:46)
    at Game1Test.Base.run(Base.java:33)
    at java.lang.Thread.run(Unknown Source)

有人可以告訴我為什么會這樣嗎? 也許是這個問題的解決方案?

謝謝

看一下API ,如果組件不可顯示,則拋出此異常。 在這種情況下,當Canvas.peernull 看一下peer領域就可以看出這一點

Component添加到也是對等的容器時,將設置對等體

由於您是從組件的構造函數啟動更新線程,因此可以在將組件添加到另一個容器之前調用render ,這意味着對peernull ,然后IllegalStateException

根據我對此錯誤的體驗以及您編寫的代碼,您錯過了一個框架功能。

添加幀的位置(例如: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); )並添加函數frame.add(game);

在這個例子中,我的是Display game = new Display(); 但是根據新顯示器的變量,它可能會有所不同。

我有完全相同的異常,但我發現這是因為我的JFrame可見性被意外設置為false。

所以放入setVisible(true); 固定它。

暫無
暫無

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

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