用double buffer技术
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Test extends Canvas
{
private Image[] backing = new Image[2];
private int imageToDraw = 1;
private int imageNotDraw = 0;
public void update(Graphics g)
{
paint(g);
}
public synchronized void paint(Graphics g)
{
g.drawImage(backing[imageToDraw],0,0,this);
}
public void addNotify()
{
super.addNotify();
backing[0]=createImage(400,400);
backing[1] = createImage(400, 400);
setSize(400,400);
new Thread(new Runnable()
{
private int direction = 1;
private int position =0;
public void run()
{
for(;;)
{
try
{
Thread.sleep(10);
}
catch(InterruptedException e)
{e.printStackTrace();}
Graphics g = backing[imageNotDraw].getGraphics();
// g.clearRect(0,0,400,400);
g.setColor(Color.pink);
g.fillRect(0,0,400,400);
g.setColor(Color.black);
g.drawOval(position,200-position,400-(2*position),72*position);
synchronized(Test.this)
{
int temp = imageNotDraw;
imageNotDraw =imageToDraw;
imageToDraw = temp;
}
position +=direction;
if(position>199)
 direction=-1;
 else
 if(position<1)
 direction=1;
 repaint();
}
}
}).start();
}
public static void main(String args[])
{
final Frame f =new Frame("double buffer");
f.add(new Test(),BorderLayout.CENTER);
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
f.setVisible(false);
f.dispose();
}
});
}
}