画布重新打开时缓冲区不会创建

时间:2014-09-05 23:21:03

标签: java swing canvas doublebuffered

好的,对于我正在创建的项目,我决定创建一个JFrame,并且有一个菜单,当点击选项时,将在JFrame的中心打开一个画布。由于渲染都是在画布上完成的,所以我对它进行了双重缓冲。现在,当我第一次按下按钮并且画布打开时,它完全没有问题,并且屏幕是双缓冲的,但是当我返回菜单并重新打开画布时,我收到错误。

创建应用程序后立即创建一个线程,这就是我使用if语句的原因,因为我在尝试使用0高度和0宽度创建缓冲区时出现错误还没有被添加到JFrame中。

这是创建缓冲区的代码:

public BufferStrategy createBuffer(){

    if(this.getWidth() > 0 && this.getHeight() > 0){
        image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);

        bs = getBufferStrategy();

        if (bs == null) {
            createBufferStrategy(2);                   
            return bs;
        }   

    }else{
        return bs;
    }
    return bs;

这是我使用该缓冲区的run()方法中的代码:

if (shouldRender) {
            Graphics g = null;
            BufferStrategy bs = createBuffers();
            if(bs != null){
                g = bs.getDrawGraphics();
                render(g, bs);
                frames++;       
            }
        }

在render()方法中,我然后调用g.dispose()和bs.show()。

这是我在重新打开画布时遇到的错误:

Exception in thread "Thread-2" java.lang.IllegalStateException: Buffers have not been created
at sun.awt.windows.WComponentPeer.getBackBuffer(Unknown Source)
at java.awt.Component$FlipBufferStrategy.getBackBuffer(Unknown Source)
at java.awt.Component$FlipBufferStrategy.flip(Unknown Source)
at java.awt.Component$FlipBufferStrategy.show(Unknown Source)
at Launcher.render(Launcher.java:106)
at Launcher.run(Launcher.java:78)
at java.lang.Thread.run(Unknown Source)

我尝试创建(1)的BufferStrategy并且它没有返回任何错误但是每当我使用2或更多时我都会收到错误。我也尝试检查BufferCapabilities,当我运行getFlipContents()时,它返回undefined。

如果有人能向我解释我哪里出错了,我会非常感激,因为我花了好几个小时努力解决这个问题。

0 个答案:

没有答案