学了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); } } ); } }
实现效果如下图。
时间: 2024-11-08 02:30:14