好的,对于我正在创建的项目,我决定创建一个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。
如果有人能向我解释我哪里出错了,我会非常感激,因为我花了好几个小时努力解决这个问题。