BufferStrategy,Java中的多个异常和错误

BufferStrategy,Java中的多个异常和错误,java,swing,exception,Java,Swing,Exception,我正在尝试制作一个相当基本的3D游戏,为我进入Ludum Dare 23年度游戏大赛做准备 我在使用Java,我在使用Swing和AWT。(我正在使用JFrame创建我的窗口(显然是idk)) 我遇到的问题是当我试图在屏幕上绘制像素时出现的。我得到了一些关于BufferStrategy和线程问题的异常 下面是Eclipse中的控制台框向我抛出的内容 Exception in thread "Thread-2" java.lang.IllegalStateException: Component

我正在尝试制作一个相当基本的3D游戏,为我进入Ludum Dare 23年度游戏大赛做准备

我在使用Java,我在使用Swing和AWT。(我正在使用JFrame创建我的窗口(显然是idk))

我遇到的问题是当我试图在屏幕上绘制像素时出现的。我得到了一些关于
BufferStrategy
和线程问题的异常

下面是Eclipse中的控制台框向我抛出的内容

Exception in thread "Thread-2" java.lang.IllegalStateException: Component must have a valid peer
    at java.awt.Component$FlipBufferStrategy.createBuffers(Component.java:3982)
    at java.awt.Component$FlipBufferStrategy.<init>(Component.java:3956)
    at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Component.java:4479)
    at java.awt.Component.createBufferStrategy(Component.java:3833)
    at java.awt.Canvas.createBufferStrategy(Canvas.java:194)
    at java.awt.Component.createBufferStrategy(Component.java:3756)
    at java.awt.Canvas.createBufferStrategy(Canvas.java:169)
    at com.ottdev.tale.TaleOfDwarvesComponent.render(TaleOfDwarvesComponent.java:66)
    at com.ottdev.tale.TaleOfDwarvesComponent.run(TaleOfDwarvesComponent.java:55)
    at java.lang.Thread.run(Thread.java:722)
线程“thread-2”java.lang.IllegalStateException中的异常:组件必须具有有效的对等方 位于java.awt.Component$FlipBufferStrategy.createBuffers(Component.java:3982) 位于java.awt.Component$FlipBufferStrategy(Component.java:3956) 位于java.awt.Component$FlipSubcionBufferStrategy(Component.java:4479) 位于java.awt.Component.createBufferStrategy(Component.java:3833) 位于java.awt.Canvas.createBufferStrategy(Canvas.java:194) 位于java.awt.Component.createBufferStrategy(Component.java:3756) 位于java.awt.Canvas.createBufferStrategy(Canvas.java:169) 位于com.ottdev.tale.TaleOfDwarvesComponent.render(TaleOfDwarvesComponent.java:66) 位于com.ottdev.tale.TaleOfDwarvesComponent.run(TaleOfDwarvesComponent.java:55) 运行(Thread.java:722) 有没有办法解决这个问题?它让我头昏脑胀,阻止我前进。非常感谢您的帮助

PS:如果需要的话,我可以提供我的源代码,但是现在,我更想知道如何修复它,这样我就可以知道如果将来遇到这种情况,我该怎么做,但是使用不同的代码

编辑:我的主课- TaleOfDwarvesComponent:

package com.ottdev.tale;    
import java.awt.*;
import java.awt.image.*;

import javax.swing.*;

import com.ottdev.tale.gui.*;

public class TaleOfDwarvesComponent extends Canvas implements Runnable {
    public static final int WIDTH = 800;
    public static final int HEIGHT = 600;
    public static final int SCALE = 2;
    public static final String TITLE = "Tale Of Dwarves!";

    private boolean running = false;
    private BufferedImage img;
    public int[] pixels;
    private Thread thread;
    private Game game;
    private Screen screen;

    public TaleOfDwarvesComponent() {
        game = new Game();
        screen = new Screen(WIDTH, HEIGHT);

        img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();



    }

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

    public void stop() {
        if (!running)
            return;
        running = false;
        try{
            thread.join();
        }catch(InterruptedException e){
            e.printStackTrace();
        }

    }

    public void run() {
        while(running){
            render();
        }
    }

    public void tick(){
        game.tick();
    }

    public void render(){

        BufferStrategy bs = getBufferStrategy();
        if(bs == null){
            createBufferStrategy(3);
            return;
        }
        screen.render(game);
        for (int i = 0; i < WIDTH * HEIGHT; i++){
            pixels[i] = screen.pixels[i];
        }

        Graphics g = bs.getDrawGraphics();
        g.fillRect(0, 0, getWidth(), getHeight());
        g.drawImage(img, 0, 0, WIDTH * SCALE, HEIGHT * SCALE, null);
        g.dispose();
        bs.show();
    }

    public static void main(String[] args) {
        TaleOfDwarvesComponent game = new TaleOfDwarvesComponent();
        JFrame frame = new JFrame();
        frame.setSize(WIDTH, HEIGHT);
        frame.setLocationRelativeTo(null);
        frame.setTitle(TITLE);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        game.start();

    }
}
package com.ottdev.tale;
导入java.awt.*;
导入java.awt.image.*;
导入javax.swing.*;
导入com.ottdev.tale.gui.*;
公共类TaleOfDwarvesComponent扩展画布实现Runnable{
公共静态最终整数宽度=800;
公共静态最终内部高度=600;
公共静态最终整数比例=2;
公共静态最终字符串TITLE=“矮人的故事!”;
私有布尔运行=false;
专用缓冲图像img;
公共整数[]像素;
私有线程;
私人游戏;
私人屏幕;
公共TaleOfDwarvesComponent(){
游戏=新游戏();
屏幕=新屏幕(宽度、高度);
img=新的BuffereImage(宽度、高度、BuffereImage.TYPE\u INT\u RGB);
像素=((DataBufferInt)img.getRaster().getDataBuffer()).getData();
}
公开作废开始(){
如果(正在运行)
返回;
运行=真;
新线程(this.start();
}
公共停车场(){
如果(!正在运行)
返回;
运行=错误;
试一试{
thread.join();
}捕捉(中断异常e){
e、 printStackTrace();
}
}
公开募捐{
(跑步时){
render();
}
}
公共空白勾号(){
game.tick();
}
公共无效呈现(){
BufferStrategy bs=getBufferStrategy();
如果(bs==null){
创新战略(3);
返回;
}
屏幕渲染(游戏);
对于(int i=0;i

我有一个
Bitmap
类和一个
Screen
类,但现在,我将把它放在这里,希望能从中找到我的问题的答案。

如果你看一下javadocs)


我相信它特别解决了您的问题,即在画布显示在屏幕上之前调用createBufferStrategy。因此,要解决您的问题,您需要在画布上添加一个ComponentListener并在ComponentShowed上调用createBufferStrategy,或者在绘制方法中调用它

确保您是在
JPanel上绘制的,而不是直接在框架上绘制。“英国,Josh。”如果我关心您是谁,我会检查您的ID。如果我关心您来自哪里,我会查的。请不要问这样的噪音。谢谢你的快速回复,我有点理解你说的话,但我有点困惑如何解决它(如果这是有意义的:P),因此,我将求助于张贴来源,我会更新帖子,希望你能进一步教育我该做什么。别再打电话给createBufferStrategy了!问题在于调用screen.render的位置。看看stacktracelol,我现在肯定是弱智了,我不明白它出了什么问题--我对Java相当陌生,所以我仍然不清楚所有的事情,抱歉,如果我看起来像个十足的白痴;你能解释一下我到底需要改变什么吗?我知道在我的帖子里我说我不知道到底是什么,但我发现这比我想象的更难理解。我现在已经尝试了一些方法,但没有一种有效。。。我真的被难住了。