我最近一直在使用BufferStrategy和JFrame进行初步图形处理。但是,当尝试在框架上绘制一个简单的矩形时,没有任何显示。这是代码:
import java.awt.*;
import java.awt.image.BufferStrategy;
import javax.swing.*;
public class GTestingMain {
public static void main(String[] args) {
JFrame myFrame = new JFrame();
Canvas myCanvas = new Canvas();
Graphics2D g;
BufferStrategy strategy;
myFrame.setSize(500, 500);
myFrame.setResizable(false);
myFrame.setLocationRelativeTo(null);
myFrame.setVisible(true);
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myCanvas.setPreferredSize(new Dimension(500, 500));
myFrame.add(myCanvas);
myFrame.pack();
strategy = myCanvas.getBufferStrategy();
if(strategy == null) {
myCanvas.createBufferStrategy(3);
}
strategy = myCanvas.getBufferStrategy();//Throwing in again so strategy != null
do {
do {
g = (Graphics2D) strategy.getDrawGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, 500, 500);
g.setColor(Color.red);
g.fillRect(10, 40, 50, 70);
g.dispose();
}while(strategy.contentsRestored());
strategy.show();
}while(strategy.contentsLost());
}
}
现在问题更加独特了。当我进入调试器并逐步执行代码时,它就可以正常工作。如果我正常运行,请空白。如果在调试器中单击框架之前将其单击,则为空白。
我知道我可以用线程“解决”此问题,但是我想知道为什么它在调试模式下有效,但不能在常规运行中使用。谢谢!
答案 0 :(得分:1)
在开始使用bufferStrategies之前,请先进行java doc
说,
缓冲策略为您提供了两种通用的绘制方法:getDrawGraphics和show。当您要开始绘图时,获取绘图图形并使用它。当您完成绘图并想在屏幕上显示您的信息时,请致电show。设计这两种方法时,它们很合适地适合渲染循环:
您所缺少的基本上是渲染循环。同样,由于它使用易失性图像作为缓冲区,所以我们永远不知道视频存储器何时丢失。这就解释了为什么要在调试模式下获取矩形。就像带有contentLost
和contentsRestored
方法的回调系统。
只需包装一下do while循环,如下所示。
while(isHappy()){ // your logic goes here.
do {
do {
g = (Graphics2D) strategy.getDrawGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, 500, 500);
g.setColor(Color.red);
g.fillRect(10, 40, 50, 70);
g.dispose();
}while(strategy.contentsRestored());
strategy.show();
}while(strategy.contentsLost());
}