Java 为什么赢了';我的图形不显示循环吗?

Java 为什么赢了';我的图形不显示循环吗?,java,image,canvas,buffer,render,Java,Image,Canvas,Buffer,Render,我正在尝试使用缓冲区,我尝试用绿色填充缓冲区,然后立即在屏幕上显示,但屏幕不会显示没有循环的绿色。有人能给我解释一下吗 public void draw() { createBufferStrategy(2); Graphics g = image.createGraphics(); BufferStrategy bs = getBufferStrategy(); for (int i = 0; i < 16; i++) { System.

我正在尝试使用缓冲区,我尝试用绿色填充缓冲区,然后立即在屏幕上显示,但屏幕不会显示没有循环的绿色。有人能给我解释一下吗

public void draw() {
    createBufferStrategy(2);

    Graphics g = image.createGraphics();
    BufferStrategy bs = getBufferStrategy();
    for (int i = 0; i < 16; i++) {
        System.out.println(i);
        if (!a) {
            g.setColor(Color.green);
            g.fillRect(0, 0, w, h);
        }
        a = true;
        Graphics bsg = bs.getDrawGraphics();
        // bsg.drawImage(image, 0, 0, h, w, null);
        // g.clearRect(0, 0, w, h);
        // g.drawOval(0, 0, 50, 50);
        bsg.setColor(Color.green);
        bsg.fillRect(0, 0, getWidth(), getHeight());
        bsg.dispose();
        bs.show();
    }

}
public void draw(){
创新战略(2);
Graphics g=image.createGraphics();
BufferStrategy bs=getBufferStrategy();
对于(int i=0;i<16;i++){
系统输出打印LN(i);
如果(!a){
g、 setColor(Color.green);
g、 fillRect(0,0,w,h);
}
a=真;
Graphics bsg=bs.getDrawGraphics();
//bsg.drawImage(图像,0,0,h,w,null);
//g.clearRect(0,0,w,h);
//g.drawOval(0,0,50,50);
bsg.setColor(颜色为绿色);
fillRect(0,0,getWidth(),getHeight());
dispose();
b.show();
}
}
我还发现,如果我将循环设置为小于16次,或者取消循环,图像将不会显示

下面是一个完整的可运行代码

public class BufferTest extends Canvas implements Runnable {

int h = 400;
int w = 400;
BufferedImage image;
boolean a;

public static void main(String[] a) {
    JFrame frame = new JFrame();
    BufferTest test = new BufferTest();
    frame.add(test);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    test.draw();
    Thread t = new Thread(test);

    // t.start();

}

public BufferTest() {
    this.setPreferredSize(new Dimension(w, h));
    image = new BufferedImage(h, w, BufferedImage.TYPE_INT_RGB);

}

public void draw() {
    createBufferStrategy(2);

//  Graphics g = image.createGraphics();
    BufferStrategy bs = getBufferStrategy();
    for (int i = 0; i < 16; i++) {
        System.out.println(i);
        //if (!a) {
            //g.setColor(Color.green);
            //g.fillRect(0, 0, w, h);
        //}
        //a = true;
        Graphics bsg = bs.getDrawGraphics();
         //bsg.drawImage(image, 0, 0, h, w, null);
         //g.clearRect(0, 0, w, h);
         //g.drawOval(0, 0, 50, 50);
        bsg.setColor(Color.green);
        bsg.fillRect(0, 0, getWidth(), getHeight());
        bsg.dispose();
        bs.show();
    }

}

@Override
public void run() {
    while (true) {
        draw();// TODO Auto-generated method stub
    }
}
}
公共类BufferTest扩展画布实现可运行{
int h=400;
int w=400;
缓冲图像;
布尔a;
公共静态void main(字符串[]a){
JFrame=新JFrame();
BufferTest test=新的BufferTest();
帧。添加(测试);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
test.draw();
螺纹t=新螺纹(试验);
//t.开始();
}
公共缓冲区测试(){
此.setPreferredSize(新尺寸(w,h));
图像=新的BuffereImage(h,w,BuffereImage.TYPE_INT_RGB);
}
公众抽签(){
创新战略(2);
//Graphics g=image.createGraphics();
BufferStrategy bs=getBufferStrategy();
对于(int i=0;i<16;i++){
系统输出打印LN(i);
//如果(!a){
//g、 setColor(Color.green);
//g、 fillRect(0,0,w,h);
//}
//a=真;
Graphics bsg=bs.getDrawGraphics();
//bsg.drawImage(图像,0,0,h,w,null);
//g、 clearRect(0,0,w,h);
//g、 drawOval(0,0,50,50);
bsg.setColor(颜色为绿色);
fillRect(0,0,getWidth(),getHeight());
dispose();
b.show();
}
}
@凌驾
公开募捐{
while(true){
draw();//TODO自动生成的方法存根
}
}
}

当循环小于16时,屏幕上会显示绿色,但它消失得太快,我们无法理解。一个循环执行将近1毫秒。这对我们的大脑来说太快了。16个周期意味着接近16毫秒,这是我们能达到的最低速度。这就是为什么当它执行16次时会出现绿色屏幕。事实上,屏幕改变了16次,但由于屏幕相互重叠的速度,我们将其视为一个单独的屏幕。尝试将线程t设置为睡眠状态,以获得更好的视图。

您想要实现什么?我只是在练习时注意到了这个问题。你能解释发生了什么吗?这可以解释循环的数量,但它仍然不能解释为什么没有循环它就不能工作。
show()
方法应该在屏幕上显示第一个已填充的缓冲区,但它没有显示我尝试过,这是真的。也许这只是JavaIDE的一个解释问题。有时会发生一些用编程逻辑无法解释的奇怪事情。当你把语句1放在语句2之前(假设它们之间没有任何关系),你会得到一个与相反顺序不同的结果。在您的代码中,对于i>0,输出是正确的,但是对于i==0,输出是不正确的。如果我们从i=1开始,也会发生同样的事情。可能是我上面提到的那种问题,因为它没有任何其他解释。