如何从 Java 中的图形堆栈中删除以前的 BufferedImages?
How can i delete previous BufferedImages from Graphics stack in Java?
我的问题很容易理解。我在 JFrame 中有一个 JPanel,以便使用下面的 drawFormula() 方法显示一些图形,以使用透视投影在屏幕上显示 3d 点。每次 drawFormula() 结束时,我只是回忆自己一次又一次地绘制形状,因为我不想有任何图像闪烁问题,所以我不使用 paintComponent 方法,但我从 panelG 调用 drawImage() 方法,我从this.getGraphics() 我的 JPanel 的方法。一切运行良好,但问题是在一定时间后它停止渲染,我相信它与每次我调用 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();
}
我认为它由于计算器溢出而停止渲染。您的代码中有一个无条件递归(drawFormula 末尾的 drawFormula()
),这会在某些时候导致计算器溢出。对于闪烁:使用 setDoubleBuffered(true),
这也应该可以解决您的问题。
我的问题很容易理解。我在 JFrame 中有一个 JPanel,以便使用下面的 drawFormula() 方法显示一些图形,以使用透视投影在屏幕上显示 3d 点。每次 drawFormula() 结束时,我只是回忆自己一次又一次地绘制形状,因为我不想有任何图像闪烁问题,所以我不使用 paintComponent 方法,但我从 panelG 调用 drawImage() 方法,我从this.getGraphics() 我的 JPanel 的方法。一切运行良好,但问题是在一定时间后它停止渲染,我相信它与每次我调用 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();
}
我认为它由于计算器溢出而停止渲染。您的代码中有一个无条件递归(drawFormula 末尾的 drawFormula()
),这会在某些时候导致计算器溢出。对于闪烁:使用 setDoubleBuffered(true),
这也应该可以解决您的问题。