FileDocCategorySizeDatePackage
TumbleItem.javaAPI DocExample6859Tue Dec 12 18:59:20 GMT 2000None

TumbleItem

public class TumbleItem extends JApplet implements ActionListener
author
jag
author
mem
author
kwalrath

Fields Summary
int
loopslot
String
dir
Timer
timer
int
pause
int
offset
int
off
int
speed
int
nimgs
int
width
JComponent
contentPane
ImageIcon[]
imgs
int
maxWidth
boolean
finishedLoading
JLabel
statusLabel
static Color[]
labelColor
Constructors Summary
Methods Summary
public voidactionPerformed(java.awt.event.ActionEvent e)

        loopslot++;

        if (!finishedLoading) {
            int colorIndex = loopslot % labelColor.length;
            try {
                statusLabel.setForeground(labelColor[colorIndex]);
            } catch (NullPointerException exc) {}
            return;
        }

        if (loopslot >= nimgs) {
            loopslot = 0;
            off += offset;

            if (off < 0) {
                off = width - maxWidth;
            } else if (off + maxWidth > width) {
                off = 0;
            }
        }

        contentPane.repaint();

        if (loopslot == nimgs - 1) {
            timer.restart();
        }
    
public java.lang.StringgetAppletInfo()

        return "Title: TumbleItem v1.2, 23 Jul 1997\n"
               + "Author: James Gosling\n"
               + "A simple Item class to play an image loop.";
    
public java.lang.String[][]getParameterInfo()

        String[][] info = {
          {"img", "string", "the directory containing the images to loop"},
          {"pause", "int", "pause between complete loops; default is 3900"},
          {"offset", "int", "offset of each image to simulate left (-) or "
                            + "right (+) motion; default is 0 (no motion)"},
          {"speed", "int", "the speed at which the frames are looped; "
                           + "default is 100"},
          {"nimgs", "int", "the number of images to be looped; default is 16"},
          {"maxwidth", "int", "the maximum width of any image in the loop; "
                              + "default is 0"}
        };
        return info;
    
protected java.net.URLgetURL(java.net.URL codeBase, java.lang.String filename)

        URL url = null;

        try {
            url = new URL(codeBase, filename);
        } catch (java.net.MalformedURLException e) {
            System.out.println("Couldn't create image: badly specified URL");
            return null;
        }

        return url;
    
public voidinit()


       
        //Get the applet parameters.
        String at = getParameter("img");
        dir = (at != null) ? at : "images/tumble";
        at = getParameter("pause");
        pause = (at != null) ? Integer.valueOf(at).intValue() : 1900;
        at = getParameter("offset");
        offset = (at != null) ? Integer.valueOf(at).intValue() : 0;
        at = getParameter("speed");
        speed = (at != null) ? (1000 / Integer.valueOf(at).intValue()) : 100;
        at = getParameter("nimgs");
        nimgs = (at != null) ? Integer.valueOf(at).intValue() : 16;
        at = getParameter("maxwidth");
        maxWidth = (at != null) ? Integer.valueOf(at).intValue() : 0;

        //Animate from right to left if offset is negative.
        width = getSize().width;
        if (offset < 0) {
            off = width - maxWidth;
        }

        //Custom component to draw the current image
        //at a particular offset.
        contentPane = new JPanel() {
            public void paintComponent(Graphics g) {
                super.paintComponent(g);

                if (finishedLoading &&
                    (loopslot > -1) && (loopslot < nimgs)) {
                    imgs[loopslot].paintIcon(this, g, off, 0);
                } 
            }
        };
        contentPane.setBackground(Color.white);
        setContentPane(contentPane);

        //Put a "Loading Images..." label in the middle of
        //the content pane.  To center the label's text in
        //the applet, put it in the center part of a
        //BorderLayout-controlled container, and center-align
        //the label's text.
        statusLabel = new JLabel("Loading Images...",
                                 JLabel.CENTER);
        statusLabel.setForeground(labelColor[0]);
        contentPane.setLayout(new BorderLayout());
        contentPane.add(statusLabel, BorderLayout.CENTER);

        //Set up the timer that will perform the animation.
        //Don't start it until all the images are loaded.
        timer = new Timer(speed, this);
        timer.setInitialDelay(pause);
        timer.setCoalesce(false);

        //Loading the images can take quite a while, so to
        //avoid staying in init() (and thus not being able
        //to show the "Loading Images..." label, we'll
        //load the images in a SwingWorker thread.
        imgs = new ImageIcon[nimgs];
        timer.start(); //Start the animation.
        final SwingWorker worker = new SwingWorker() {
            public Object construct() {
                URL baseURL = getCodeBase();
                String prefix = dir + "/T";
                //Images are numbered 1 to nimgs,
                //but fill array from 0 to nimgs-1.
                for (int i = 0; i < nimgs; i++) {
                    imgs[i] = new ImageIcon(getURL(baseURL,
                                     prefix + (i+1) + ".gif"));
                }
                finishedLoading = true;
                return imgs;
            }
            public void finished() {
                //Remove the "Loading images" label.
                contentPane.removeAll();
                contentPane.repaint();
                loopslot = -1;
            }
        };
        worker.start();
    
public voidstart()

        if (finishedLoading && (nimgs > 1)) {
            timer.restart();
        }
    
public voidstop()

        timer.stop();