FileDocCategorySizeDatePackage
Animator.javaAPI DocExample2482Thu Aug 08 12:25:50 BST 1996None

Animator.java

// This example is from the book _Java in a Nutshell_ by David Flanagan.
// Written by David Flanagan.  Copyright (c) 1996 O'Reilly & Associates.
// You may study, use, modify, and distribute this example for any purpose.
// This example is provided WITHOUT WARRANTY either expressed or implied.

/**
 * This applet displays an animation.  It doesn't handle errors while
 * loading images.  It doesn't wait for all images to be loaded before
 * starting the animation.  These problems will be addressed later.
 **/
import java.applet.*;
import java.awt.*;
import java.net.*;
import java.util.*;

public class Animator extends Applet implements Runnable {
    protected Image[] images;
     protected int current_image;

    // Read the basename and num_images parameters.
    // Then read in the images, using the specified base name.
    // For example, if basename is images/anim, read images/anim0, 
    // images/anim1, etc.  These are relative to the current document URL.
    public void init() {
        String basename = this.getParameter("basename");
        int num_images;
        try { num_images = Integer.parseInt(this.getParameter("num_images")); }
        catch (NumberFormatException e) { num_images = 0; }
        
        images = new Image[num_images];
        for(int i = 0; i < num_images; i++) {
            images[i] = this.getImage(this.getDocumentBase(), basename + i);
        }
    }

    // This is the thread that runs the animation, and the methods
    // that start it and stop it.
    private Thread animator_thread = null;
    public void start() {
        if (animator_thread == null) {
            animator_thread = new Thread(this);
            animator_thread.start();
        }
    }
    public void stop() {
        if ((animator_thread != null) && animator_thread.isAlive()) 
            animator_thread.stop();
        // We do this so the garbage collector can reclaim the Thread object.
        // Otherwise it might sit around in the Web browser for a long time.
        animator_thread = null;
    }
    
    // This is the body of the thread--the method that does the animation.
    public void run() {
        while(true) {
            if (++current_image >= images.length) current_image = 0;
            this.getGraphics().drawImage(images[current_image], 0, 0, this);
            this.getToolkit().sync();  // Force it to be drawn *now*.
            try { Thread.sleep(200); } catch (InterruptedException e) { ; }
        }
    }
}