如何从Java中的Graphics堆栈中删除以前的BufferedImages?

时间:2015-03-15 14:28:29

标签: java bufferedimage

我的问题很容易理解。我在JFrame中有一个JPanel,以便使用下面的drawFormula()方法显示一些图形,使用透视投影在屏幕上显示3d点。每次drawFormula()到达它的结尾我只是回想起自己一次又一次地绘制形状,因为我不想有任何图像闪烁的问题我不使用paintComponent方法,但我从panelG调用drawImage()方法我得到的我的JPanel的this.getGraphics()方法。一切运行正常,但问题是在一定时间后它停止渲染,我相信它与每次调用drawImage()时它所持有的BufferedImages列表有关。有没有办法从堆栈中删除以前不需要的图像?提前谢谢!

public void drawFormula(){

    for(double i=latMin;i<latMax;i+= 0.05){
        for(double j=longMin;j<longMax;j+= 0.05){

            calc(m,n1,n2,n3,i,j);

            applyRotationX();
            applyRotationY();
            applyRotationZ();


            if(outX>xxmin && outX<xxmax && outY>yymin && outY<yymax){
                xxx = (int)((outX-xxmin)*xinc);
                yyy = (int)((outY-yymin)*yinc);
                zzz = (int)((outZ-zzmin)*zinc);

                //img_g.drawRect(xxx, yyy, 1, 1);
                //img_g.drawRect((int) (planeX.getOffset(new Vector3D(xxx,yyy,zzz)))+600,(int) (planeY.getOffset(new Vector3D(x[i],y[i],z[i])))+350+j,1,1);
                //img_g.setColor(new Color(Color.HSBtoRGB((float)(outX/outY), (float)(outY), (float)(outZ))));

                drawPoint(xxx, yyy, zzz);

                //panelG.drawImage(img, 0, 0, null);
            }
        }
    }

    //panelG.dispose();
    //panelG = getGraphics().create();

    panelG.drawImage(img, 0, 0, null);



    thetaX += 1;
    thetaX %= 360;


    img_g.setColor(Color.black);
    img_g.fillRect(0, 0, getWidth(), getHeight());
    drawFormula();

}

1 个答案:

答案 0 :(得分:3)

我认为它会因堆栈溢出而停止渲染。您的代码中有一个无条件的递归(drawFormula末尾的drawFormula()),这会在某个时刻导致堆栈溢出。对于闪烁:使用setDoubleBuffered(true),这也可以解决您的问题。