// This example is from _Java Examples in a Nutshell_. (http://www.oreilly.com) // Copyright (c) 1997 by David Flanagan // This example is provided WITHOUT ANY WARRANTY either expressed or implied. // You may study, use, modify, and distribute it for non-commercial purposes. // For any commercial use, see http://www.davidflanagan.com/javaexamples import java.applet.*; import java.awt.*; /** An applet that displays a simple animation */ public class BouncingCircle extends Applet implements Animation { int x = 150, y = 50, r=50; // position and radius of the circle int dx = 11, dy = 7; // trajectory of circle /** A timer for animation: call our animate() method ever 100 * milliseconds. Creates a new thread. */ AnimationTimer timer = new AnimationTimer(this, 100); /** Draw the circle at its current position */ public void paint(Graphics g) { g.setColor(Color.red); g.fillOval(x-r, y-r, r*2, r*2); } /** Move and bounce the circle and request a redraw. * The timer calls this method periodically. */ public void animate() { // Bounce if we've hit an edge. if ((x - r + dx < 0) || (x + r + dx > bounds().width)) dx = -dx; if ((y - r + dy < 0) || (y + r + dy > bounds().height)) dy = -dy; // Move the circle. x += dx; y += dy; // Ask the browser to call our paint() method to draw the circle // at its new position. repaint(); } /** Start the timer when the browser starts the applet */ public void start() { timer.start_animation(); } /** Pause the timer when browser pauses the applet */ public void stop() { timer.pause_animation(); } } /** This interface for objects that can be animated by an AnimationTimer */ interface Animation { public void animate(); } /** The thread class that periodically calls the animate() method */ class AnimationTimer extends Thread { Animation animation; // The animation object we're serving as timer for int delay; // How many milliseconds between "animation frames" public AnimationTimer(Animation animation, int delay) { this.animation = animation; this.delay = delay; } public void start_animation() { if (isAlive()) super.resume(); else start(); } public void pause_animation() { suspend(); } /** Loop forever, calling animate(), and then pausing the specified time. */ public void run() { for(;;) { animation.animate(); try { Thread.sleep(delay); } catch (InterruptedException e) { ; } } } }