思路是:在内存中开辟一块和当前绘图区一样大的buffer区域,所有的绘制工作都在这个buffer中完成。然后调用drawImage方法将这个buffer中的内容绘制到屏幕上
书上的例子,供参考:
/*从Java2 complete reference中剽的一个关于双缓冲的例子
 *用的是applet表现的
 *基本原理:
 *首先获得你的屏幕绘图区域的大小;
 *进而在内存中开辟一个同样大小的缓冲区域
 *将所有的绘图操作在内存中的缓冲中进行
 *从而防止在屏幕进行绘图产生的闪烁
 *覆盖update()方法从而防止用底色刷新屏幕时的闪烁
 */
import java.awt.*;
import java.awt.event.*;
import java.applet.*;/*
<applet code="DoubleBuffer" width=250 height=250>
</applet>
*/public class DoubleBuffer extends Applet
{
int gap = 3;
int mx, my;
boolean flicker = true;
Image buffer = null;
int w, h;

public void init()
{
Dimension d = getSize();
//获取用户屏幕的大小
w = d.width;
h = d.height;
buffer = createImage(w, h);
//以同样的大小在内存中开辟一块缓冲区,并将buffer指向它
addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseDragged(MouseEvent me)
{
mx = me.getX();
my = me.getY();
flicker = false;
repaint();
}
public void mouseMoved(MouseEvent me)
{
mx = me.getX();
my = me.getY();
flicker = true;
repaint();
}
});
}

public void paint(Graphics g)
{
Graphics screengc = null;
if(!flicker)
{
screengc = g;
g = buffer.getGraphics();
//将g指向缓冲区域
}

g.setColor(Color.blue);
g.fillRect(0, 0, w, h);

g.setColor(Color.red);
for(int i=0; i<w; i+=gap)
g.drawLine(i, 0, w-i, h);
for(int i=0; i<h; i+=gap)
g.drawLine(0, i, w, h-i);

g.setColor(Color.black);
g.drawString("Press mouse button to double buffer", 10, h/2);

g.setColor(Color.yellow);
g.fillOval(mx-gap, my-gap, gap*2+1, gap*2+1);

if(!flicker)
{
screengc.drawImage(buffer, 0, 0, null);
//通过drawImage方法向用户屏幕绘图,双缓冲实现
}
}
public void update(Graphics g)
{
//覆盖update方法可以更进一步的解决屏幕闪烁的问题
//因为update默认的方法是先用背景色将屏幕填充一遍之后再调用paint方法
paint(g);
}
}