图像在1秒后加载

时间:2016-02-14 02:36:49

标签: java graphics2d

出于某种原因,即使我在thread.sleep()

之前调用了渲染,我的图像也会在1秒后加载
public void init (){
    image=new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
    g= (Graphics2D) image.getGraphics();

    running=true;
}

public void run (){
    init();

    while(running){
        long start=System.nanoTime();
        update();
        render();   
        drawToScreen();

        try{
            thread.sleep(1000);
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}

public void update (){

}

public void render (){
    g.clearRect(0, 0, WIDTH, HEIGHT);
    g.setColor(Color.white);
    g.fillRect(0, 0, WIDTH, HEIGHT);
    g.setColor(Color.red);
    for(int r=0; r<16; r++){
        for(int c=0; c<16; c++){
            MazeCell m=maze[15-r][c];
            int y=15-m.getRow();
            int x=m.getCol();




            if(m.getWallUp()) g.drawLine(x*50, y*50, (x+1)*50, y*50);
            if(m.getWallDown()) g.drawLine(x*50, (y+1)*50, (x+1)*50, (y+1)*50);
            if(m.getWallLeft()) g.drawLine(x*50, y*50, x*50, (y+1)*50);
            if(m.getWallRight()) g.drawLine((x+1)*50, y*50, (x+1)*50, (y+1)*50);
        }
    }

    g.drawImage(mouseImage, mouse.getCol()*50, (15-mouse.getRow())*50, null);

}

public void drawToScreen (){
    Graphics g2=getGraphics();
    g2.drawImage (image, 0, 0, null);
    g2.dispose();
}

所有内容都会绘制,但首先会有一个空白的灰色屏幕,它只会在1秒后(线程休眠的时间)加载,即使先调用render和drawToScreen。我真的不知道原因。

1 个答案:

答案 0 :(得分:0)

改变你的:

g2.dispose();

要:

g2.finalize();

此外,Graphics.drawImage()方法的说明指出:

  

绘制尽可能多的指定图像。在此图形上下文的坐标空间中,图像以其左上角(x,y)绘制。图像中的透明像素不会影响已存在的任何像素。   此方法在所有情况下都会立即返回,即使尚未加载完整图像,也没有为当前输出设备进行抖动和转换。

     

如果图像已完全加载且其像素不再被更改,则drawImage将返回true。否则,drawImage返回false,并且随着更多图像变得可用或是时候绘制另一帧动画,加载图像的过程会通知指定的图像观察者。

换句话说,无论图像绘制是否完成,呼叫都会立即返回。

您可以使用MediaTracker在调用Graphics.drawImage()之前首先确保已加载图像:

       long timeout = 60000;  // 60 seconds
       MediaTracker tracker = new MediaTracker(this);
       tracker.addImage(image, 0);
       try {
         if (!tracker.waitForID( 0, timeout ) ) {
           System.out.println( "Timed Out!" );
           return;
         }
       } 
       catch( Exception ex) {
         System.out.println( "Error waiting for the image to load." );
         return;
       }

       boolean isFinished = g.drawImage(image, 0, 0, this);