【问题标题】:why won't my drawings display without a loop?为什么我的图纸没有循环显示?
【发布时间】:2014-10-09 21:09:48
【问题描述】:

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

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();
    }

}

我还发现,如果我将循环设置为小于 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
    }
}
}

【问题讨论】:

  • 你想达到什么目的?
  • 当我注意到这个问题时,我只是在练习。你能解释一下发生了什么吗?

标签: java image canvas buffer render


【解决方案1】:

当循环小于 16 时,屏幕上会出现绿色,但它消失得如此之快,以至于我们无法理解。一个循环执行了将近 1 ms。这是为了我们的大脑禁食。 16 个周期意味着将近 16 毫秒,这是我们可以捕捉到的最低速度。这就是为什么当它执行 16 次时你会看到绿屏的原因。事实上,屏幕变化了 16 次,但由于屏幕相互叠加的速度,我们将其视为单个屏幕。尝试将 Thread t 置于睡眠状态几毫秒以获得更好的视图。

【讨论】:

  • 这有点解释了循环的数量,但它仍然没有解释为什么没有循环就不能工作。 show() 方法应该在屏幕上显示第一个填充的缓冲区,但它没有
  • 是的,我试过了,这是真的。也许这只是 Java IDE 的解释问题。有时会发生无法用编程逻辑解释的奇怪事情。当您将 statement1 放在 statement2 之前(假设它们彼此无关)时,您会得到与相反顺序不同的结果。在您的代码中,输出对于 i>0 是正确的,但对于 i==0 则不正确。如果我们从 i=1 开始,会发生同样的事情。大概就是我上面提到的那种问题,因为没有其他解释。
猜你喜欢
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
相关资源
最近更新 更多