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