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);
					}
				}
		);
	}
}
实现效果如下图。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值