这是在做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);//将背后屏幕画的贴在前面屏幕上 }