JAVA双缓冲问题
*当我们应用程序的逻辑要对系统界面进行更新时,调用repaint() 方法来通知AWT线程进行刷新操作。repaint() 方法实际会让AWT线程去调用另外一个方法,update。update方法在默认情况下会做两件事,一是清除当前区域内容,二是调用其paint()方法完成实际绘制工作。
*第一个优化工作就是重写update() 方法,也就是不对当前区域进行清除工作,而直接进行绘制.
*paint(g)中的g代表屏幕对象,直接对代表屏幕对象的Graphics对象进行操作,而这个操作是比较费时的操作。解决的办法是采用“双缓冲”,即我们创建一个绘制缓冲区,以bufImage表示,先将主要的图形元素一个一个地绘制到此缓冲图像上,再将此缓冲图像一次性绘到代表屏幕的Graphics对象,即paint() 方法传入的“g”上。所以主要就是要重写update和paint方法
@Override
public void update(Graphics g)
{
//1.得到缓冲图像
this.buffer = (BufferedImage) createImage(width,height);
//2.得到缓冲图像的画笔
Graphics gOffScreen = this.buffer.getGraphics();
//3.绘制缓冲图像
ImageIcon img = new ImageIcon(
"images/chatDialog/chatDialog.png");
gOffScreen.drawImage(img.getImage(), 0, 0,width,height, null);
//4.调用paint(),将缓冲图象的画笔传入
paint(gOffScreen);
//5.再将此缓冲图像一次性绘到代表屏幕的Graphics对象,即该方法传入的“g”上
g.drawImage(buffer, 0, 0, null);
}
@Override
public void paint(Graphics g)
{
ImageIcon img = new ImageIcon(
"images/chatDialog/chatDialog.png");
g.drawImage(img.getImage(), 0, 0,width,height, null);
}