即使在使用 Java Swing 一年多之后,它对我来说仍然很神奇。如何正确使用 BufferStrategy,尤其是方法createBufferSrategy()
?
我想要一个 JFrame 和一个 Canvas 被添加到它然后绘制。我还希望能够调整 ( setSize()
) 画布的大小。每次我调整 Canvas 的大小时,似乎我BufferStrategy
都会被丢弃,或者更确切地说,变得无用,因为使用show()
onBufferStrategy
实际上并没有做任何事情。此外,createBufferStrategy()
有一个奇怪的非确定性行为,我不知道如何正确同步它。
这就是我的意思:
public class MyFrame extends JFrame {
MyCanvas canvas;
int i = 0;
public MyFrame() {
setUndecorated(false);
setVisible(true);
setSize(1100, 800);
setLocation(100, 100);
setDefaultCloseOperation(EXIT_ON_CLOSE);
canvas = new MyCanvas();
add(canvas);
canvas.makeBufferStrat();
}
@Override
public void repaint() {
super.repaint();
canvas.repaint();
//the bigger threshold's value, the more likely it is that the BufferStrategy works correctly
int threshold = 2;
if (i < threshold) {
i++;
canvas.makeBufferStrat();
}
}
}
MyCanvas
有一个方法makeBufferStrat()
和repaint()
:
public class MyCanvas extends Canvas {
BufferStrategy bufferStrat;
Graphics2D g;
public MyCanvas() {
setSize(800, 600);
setVisible(true);
}
public void makeBufferStrat() {
createBufferStrategy(2);
//I'm not even sure whether I need to dispose() those two.
if (g != null) {
g.dispose();
}
if (bufferStrat != null) {
bufferStrat.dispose();
}
bufferStrat = getBufferStrategy();
g = (Graphics2D) (bufferStrat.getDrawGraphics());
g.setColor(Color.BLUE);
}
@Override
public void repaint() {
g.fillRect(0, 0, 100, 100);
bufferStrat.show();
}
}
我只是从 main 方法中的 while(true) 循环中调用MyFrame
'srepaint()
方法。当threshold
很小(即 2)时,bufferStrat.show()
大约 70% 的情况下什么都不做 - JFrame 在启动程序时保持灰色。剩下的 30% 它按照它应该的方式绘制矩形。如果我这样做threshold = 200;
了,那么在我执行程序的时间里,绘画成功率接近 100%。Javadoc 说这createBufferStrategy()
可能需要一段时间,所以我认为这就是问题所在。但是,如何正确同步和使用它?显然,我在这里做错了什么。我无法想象它应该如何使用。
有没有人有一个最小的工作示例?