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