程序原文如下,根据书上的例子写的,想实现雪花落下的动画,但是雪花就是不动,只有在窗口改变大小时,才执行repaintimport java.awt.*;
import java.awt.image.*;
import java.net.*;public class snow extends Frame implements Runnable{ boolean isPainted=false;
Image img0;
Image imgSnow0;
Image buffer;
Graphics bg;
// int img0_w=0,img0_h=0;
int buf_w=0,buf_h=0;
private Thread runner;
snowFlower sf=new snowFlower();
public boolean handleEvent(Event evt)
{
if(evt.id==Event.WINDOW_DESTROY)
System.exit(0);
return false;
}
public snow()
{
setTitle("snowing");
img0=Toolkit.getDefaultToolkit().getImage("img/imgbk.png");
imgSnow0=Toolkit.getDefaultToolkit().getImage("img/snow0.png");
}
public void update(Graphics g)
{
paint(g);
System.out.println("updating");
}
public void paint(Graphics g)
{

if(img0.getHeight(null)<=0 || img0.getWidth(null)<=0)
{
buffer=createImage(1,1);
bg=buffer.getGraphics();
bg.drawImage(img0,0,0,this);
bg.dispose();
System.out.println("Init Image");
return;
}
if(imgSnow0.getHeight(null)<=0 || imgSnow0.getWidth(null)<=0)
{
buffer=createImage(1,1);
bg=buffer.getGraphics();
bg.drawImage(imgSnow0,0,0,this);
bg.dispose();
System.out.println("Init Image");
return;
}
start();
Dimension d=size();
Insets in =insets();

int client_w=d.width-in.right-in.left;
int client_h=d.height-in.bottom-in.top;
if(client_w!=buf_w || client_h!=buf_h)
{
buf_w=client_w;
buf_h=client_h;

buffer=createImage(buf_w,buf_h);
bg=buffer.getGraphics();
bg.drawImage(img0,0,0,null);
for(int i=0;i<=buf_w/img0.getWidth(null);i++)
{
for(int j=0;j<=buf_h/img0.getHeight(null);j++)
{
if(i+j>0)bg.copyArea(0,0,img0.getWidth(null),img0.getHeight(null),
i*img0.getWidth(null),j*img0.getHeight(null));
}
}
bg.drawImage(imgSnow0,sf.x,sf.y,null);
System.out.println("painting"+sf.y);
bg.dispose();
}
g.drawImage(buffer,in.left,in.top,this);
isPainted=true;
// g.drawImage(imgSnow0,sf.x,sf.y,null);

}
public boolean imageUpdate(Image image,int infoflags,
int x,int y, int w,int h)
{
if((infoflags & ImageObserver.ALLBITS)!=0)
{
repaint();
return false;
}
return true;
}
public void start()
{
if(runner==null)
{
runner=new Thread(this);
runner.start();
// System.out.println("runner is start");
}
}
public void run()
{
while(runner!=null)//if(isPainted)
{
isPainted=false;
// repaint(sf.x,sf.y,10,10);
repaint();
sf.run();
try{Thread.sleep(100);}
catch(InterruptedException e){}
// System.out.println("runner is run");
}
}
public static void main(String[] args) {
Frame f=new snow();
f.resize(200,300);
f.show();
}
class snowFlower {
int x=50,y=0;
int w=0,h=0;
snowFlower(){}
public void drop()
{
y+=3;
if(y>buffer.getHeight(null))
{
y=0;
}
System.out.println("drop"+y);
} public void run()
{
drop();
}
};}