我的问题很容易理解。我在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();

}

最佳答案

我认为由于stackoverflow而停止渲染。您的代码中有无条件的递归(drawFormula末尾的drawFormula()),这将在某些时候导致stackoverflow。对于闪烁:使用setDoubleBuffered(true),这也可以解决您的问题。

关于java - 如何从Java的Graphics堆栈中删除以前的BufferedImages?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29061749/

10-10 22:40