这是在做java的一个小项目叫坦克大战的时候遇到的一个问题,就是使用线程进行repaint()面板的时候总是出现闪烁的问题,由于repaint()要把所有图像都重新绘制一遍,因此出现了闪烁。
那么怎么解决闪烁这个问题呢,我们就用到了双缓冲这一技巧(double buffer),我们首先创建一张基于原面板的一场图像,先将绘制图像的工作在这张图片上面完成,最后再将这张图片直接贴到面板上面,这样就不用直接在面板上进行绘制,因此闪烁现象也就消失了。
@Override
//在repaint()调用paint()方法之前,还会先调用update()方法
private Image offScreenImage;
public void update(Graphics g) {//g是前面屏幕的画笔
if(offScreenImage == null)
offScreenImage = this.createImage(WIDTH,HEIGHT);
Graphics gOffScreen = offScreenImage.getGraphics();//gOffScreen是背后屏幕的画笔
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0, 0, WIDTH,HEIGHT);//画矩形
gOffScreen.setColor(c);
paint(gOffScreen);//在背后屏幕画
g.drawImage(offScreenImage, 0, 0, null);//将背后屏幕画的贴在前面屏幕上
}