JFrame不显示画布

时间:2018-06-26 16:32:43

标签: java graphics

我最近一直在使用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());

}

}

现在问题更加独特了。当我进入调试器并逐步执行代码时,它就可以正常工作。如果我正常运行,请空白。如果在调试器中单击框架之前将其单击,则为空白。

我知道我可以用线程“解决”此问题,但是我想知道为什么它在调试模式下有效,但不能在常规运行中使用。谢谢!

1 个答案:

答案 0 :(得分:1)

在开始使用bufferStrategies之前,请先进行java doc

说,

  

缓冲策略为您提供了两种通用的绘制方法:getDrawGraphics和show。当您要开始绘图时,获取绘图图形并使用它。当您完成绘图并想在屏幕上显示您的信息时,请致电show。设计这两种方法时,它们很合适地适合渲染循环:

您所缺少的基本上是渲染循环。同样,由于它使用易失性图像作为缓冲区,所以我们永远不知道视频存储器何时丢失。这就解释了为什么要在调试模式下获取矩形。就像带有contentLostcontentsRestored方法的回调系统。

只需包装一下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());
}