首页 > 代码库 > AWT的双缓存技术

AWT的双缓存技术

学了AWT,学到双缓存技术,于是照着书将双缓存技术的代码给实现了。

另外插一句,swing组件的JComponent组件默认缓存区,不必自己写代码。如果想关闭双缓冲区,可以在组件上施加setDoubleBuffered(false)

import java.awt.*;
import java.awt.event.*;
/*
 * 双缓存技术
 * 可以将绘制的内容保留在一个Image对象中,如果需要重新显示绘制的内容,仅仅简单地将这个Image内容再现就可以了。
 * (1)img起到缓存的作用,og在其上进行绘制
 * (2)createImage必须在MyCanvas显示后才能调用,所以mc.init()放在f.setVisible(true)后
 * (3)当窗口缩小,移动等情况发生后,只针对img进行绘制操作,不再对每个细节进行绘制
 */
class MyCanvas extends Canvas{
	private Image img;
	private Graphics og;
	public void init(){
		Dimension d=getSize();
		img=createImage(d.width,d.height);
		og=img.getGraphics();
		og.setColor(Color.blue);
		og.fillRect(30, 30, 60, 60);
		og.setColor(Color.yellow);
		og.fillOval(15,15,30,30);
		og.setXORMode(Color.red);
		og.fillOval(75, 75, 30, 30);
		og.setPaintMode();
		og.setColor(Color.green);
		og.fillArc(150, 40, 60, 60, 30, 160);
	}
	public void paint(Graphics g){
		if(img!=null){
			g.drawImage(img, 20, 20, this);
		}
	}
}
public class DoubleBufferDemo {
	public static void main(String args[]){
		Frame f=new Frame("DoubleBufferDemo");
		f.setBounds(100,100,250,200);
		MyCanvas mc=new MyCanvas();
		f.add(mc);
		f.setVisible(true);
		mc.init();
		mc.repaint();
		f.addWindowListener(
				new WindowAdapter(){
					public void windowClosing(WindowEvent e){
						System.exit(0);
					}
				}
		);
	}
}
实现效果如下图。



AWT的双缓存技术