import java.applet.*; import java.awt.*; import java.util.*; //This version uses buffered image to eliminate flashing public class Rain extends Applet implements Runnable { Thread thread; Image bImage; Graphics bg; int i = 23; RainDrop[] rainDrops; private static final int MAXDROPS = 100; public void init() { bImage = createImage(size().width, size().height); bg = bImage.getGraphics(); rainDrops = new RainDrop[MAXDROPS]; rainDrops[0] = new RainDrop( size().width/2, size().height/2 ); } public boolean mouseUp(Event evt, int x, int y) { RainDrop drop = new RainDrop( x, y ); for ( int i = 0; i < MAXDROPS; i++ ) { if ( rainDrops[i] == null ) { rainDrops[i] = drop; break; } } return super.mouseUp(evt,x,y); } public void start() { if (thread == null) { thread = new Thread(this); thread.start(); } } public void run() { while (true) { repaint(); try { Thread.sleep(100); } catch (InterruptedException e) {} } } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { bg.setColor(getBackground()); bg.fillRect(0, 0, size().width, size().height); bg.setColor(Color.blue); for ( int i = 0; i < MAXDROPS; i++ ) { if ( rainDrops[i] == null ) continue; RainDrop drop = rainDrops[i]; drop.draw(bg,size().width,size().height); drop.radius += 2; //if ( drop.radius > size().height*2 ) // rainDrops[i] = null; if ( drop.radius > size().height/2 ) drop.radius = 0; } g.drawImage(bImage, 0, 0, this); } public void stop() { thread.stop(); thread = null; } public void destroy() { bg.dispose(); } }