Figure 5

A VCR animation applet in Java


/**
   A VCR in Java
   @author Mark C. Reynolds
   @version 1.0, 23 Feb, 1996
*/

import java.applet.*;
import java.awt.*;
import java.net.*;

public class Vcr extends Applet implements Runnable {
  MediaTracker tracker;
  Dimension nodim;
  Thread animthread = null;
  Image imgs[];
  static final String FWD =   "FWD";
  static final String REV =   "REV";
  static final String STOP =  "STOP";
  static final String EJECT = "EJECT";
  int whichimg = 0;
  int imginc = 0;               // +1 = forward, -1 = reverse, 0 = stop
  int nimgs = 0;
  boolean done = false;

  public void init() {
        BorderLayout nl;
        FlowLayout fl;
        Button bu[];
        Font fo;
        Panel so;
        Panel no;
        String tmp;
        String imgloc;

        imgloc = getParameter("imgloc");
        if ( imgloc != null ) {
          tmp = getParameter("nimgs");
          if ( tmp != null ) {
                nimgs = Integer.parseInt(tmp);
                if ( nimgs > 0 ) {
                  imgs = new Image[nimgs];
                  tracker = new MediaTracker(this);
                  for(int i = 0, j = 1; i < nimgs; i++, j++) {
                        imgs[i] = getImage(getDocumentBase(), imgloc + j + ".gif");
                        tracker.addImage(imgs[i], 0);
                  }

                  nl = new BorderLayout();
                  setLayout(nl);
                  no = new Panel();
                  nodim = preferredSize();
                  no.resize(nodim.width, nodim.height-50);
                  add("North", no);
                  so = new Panel();
                  fl = new FlowLayout(FlowLayout.LEFT);
                  so.setLayout(fl);
                  add("South", so);
                  bu = new Button[4];
                  bu[0] = new Button(Vcr.FWD);
                  bu[1] = new Button(Vcr.REV);
                  bu[2] = new Button(Vcr.STOP);
                  bu[3] = new Button(Vcr.EJECT);
                  fo = new Font("Helvetica", Font.PLAIN, 14);
                  for(int i = 0; i < 4; i++)
                        bu[i].setFont(fo);
                  so.add(bu[0]);
                  so.add(bu[1]);
                  so.add(bu[2]);
                  so.add(bu[3]);
                }
          }
        }
  }

  public void run() {
        Thread me;

        if ( nimgs < 1 || imgs == null ) return;
        try {
                tracker.waitForID(0);
          } catch (InterruptedException e) {

                return;
          }
        me = Thread.currentThread();
        me.setPriority(Thread.NORM_PRIORITY-1);
        while ( animthread != null ) {
          whichimg += imginc;
          if ( whichimg < 0 )
                {
                  whichimg = 0;
                  imginc = 0;
                }
          if ( whichimg >= nimgs )
                {
                  whichimg = (nimgs - 1);
                  imginc = 0;
                }
          if ( imginc != 0 ) repaint();
          try {
                Thread.sleep(100);
          } catch (InterruptedException e) {
                break;
          }
        }
  }

  public void paint(Graphics g) {
        if ( done == false ) {
          if ( ( imgs != null ) && ( 0 <= whichimg ) && ( whichimg < nimgs ) &&
                  ( imgs[whichimg] != null ) ) {
                g.drawImage(imgs[whichimg], 0, 0, this);
          }
        } else {
          g.clearRect(0, 0, nodim.width, nodim.height);
        }
  }

  public void start() {
        if ( animthread == null ) {
          animthread = new Thread(this);
          animthread.start();
        }
  }

  public void stop() {
        if ( animthread != null ) {
          animthread.stop();
          animthread = null;
          repaint();
        }
  }

  public boolean action(Event evt, Object arg) {
        Button thebut;
        String thelab;
        boolean handled = false;

        if ( evt.target instanceof Button ) {
          thebut = (Button)(evt.target);
          thelab = thebut.getLabel();
          if ( thelab.equals(Vcr.FWD) ) {
                imginc = 1;
                handled = true;
          } else if ( thelab.equals(Vcr.REV) ) {
                imginc = (-1);
                handled = true;
          } else if ( thelab.equals(Vcr.STOP) ) {
                imginc = 0;
                handled = true;
          } else if ( thelab.equals(Vcr.EJECT) ) {
                imginc = 0;
                done = true;
                stop();
                handled = true;
          }
        }
        return(handled);
  }
}


/**
   A VCR in Java
   @author Mark C. Reynolds
   @version 1.0, 23 Feb, 1996
*/

import java.applet.*;
import java.awt.*;
import java.net.*;

public class Vcr extends Applet implements Runnable {
  MediaTracker tracker;
  Dimension nodim;
  Thread animthread = null;
  Image imgs[];
  static final String FWD =   "FWD";
  static final String REV =   "REV";
  static final String STOP =  "STOP";
  static final String EJECT = "EJECT";
  int whichimg = 0;
  int imginc = 0;               // +1 = forward, -1 = reverse, 0 = stop
  int nimgs = 0;
  boolean done = false;

  public void init() {
        BorderLayout nl;
        FlowLayout fl;
        Button bu[];
        Font fo;
        Panel so;
        Panel no;
        String tmp;
        String imgloc;

        imgloc = getParameter("imgloc");
        if ( imgloc != null ) {
          tmp = getParameter("nimgs");
          if ( tmp != null ) {
                nimgs = Integer.parseInt(tmp);
                if ( nimgs > 0 ) {
                  imgs = new Image[nimgs];
                  tracker = new MediaTracker(this);
                  for(int i = 0, j = 1; i < nimgs; i++, j++) {
                        imgs[i] = getImage(getDocumentBase(), imgloc + j + ".gif");
                        tracker.addImage(imgs[i], 0);
                  }

                  nl = new BorderLayout();
                  setLayout(nl);
                  no = new Panel();
                  nodim = preferredSize();
                  no.resize(nodim.width, nodim.height-50);
                  add("North", no);
                  so = new Panel();
                  fl = new FlowLayout(FlowLayout.LEFT);
                  so.setLayout(fl);
                  add("South", so);
                  bu = new Button[4];
                  bu[0] = new Button(Vcr.FWD);
                  bu[1] = new Button(Vcr.REV);
                  bu[2] = new Button(Vcr.STOP);
                  bu[3] = new Button(Vcr.EJECT);
                  fo = new Font("Helvetica", Font.PLAIN, 14);
                  for(int i = 0; i < 4; i++)
                        bu[i].setFont(fo);
                  so.add(bu[0]);
                  so.add(bu[1]);
                  so.add(bu[2]);
                  so.add(bu[3]);
                }
          }
        }
  }

  public void run() {
        Thread me;

        if ( nimgs < 1 || imgs == null ) return;
        try {
                tracker.waitForID(0);
          } catch (InterruptedException e) {

                return;
          }
        me = Thread.currentThread();
        me.setPriority(Thread.NORM_PRIORITY-1);
        while ( animthread != null ) {
          whichimg += imginc;
          if ( whichimg < 0 )
                {
                  whichimg = 0;
                  imginc = 0;
                }
          if ( whichimg >= nimgs )
                {
                  whichimg = (nimgs - 1);
                  imginc = 0;
                }
          if ( imginc != 0 ) repaint();
          try {
                Thread.sleep(100);
          } catch (InterruptedException e) {
                break;
          }
        }
  }

  public void paint(Graphics g) {
        if ( done == false ) {
          if ( ( imgs != null ) && ( 0 <= whichimg ) && ( whichimg < nimgs ) &&
                  ( imgs[whichimg] != null ) ) {
                g.drawImage(imgs[whichimg], 0, 0, this);
          }
        } else {
          g.clearRect(0, 0, nodim.width, nodim.height);
        }
  }

  public void start() {
        if ( animthread == null ) {
          animthread = new Thread(this);
          animthread.start();
        }
  }

  public void stop() {
        if ( animthread != null ) {
          animthread.stop();
          animthread = null;
          repaint();
        }
  }

  public boolean action(Event evt, Object arg) {
        Button thebut;
        String thelab;
        boolean handled = false;

        if ( evt.target instanceof Button ) {
          thebut = (Button)(evt.target);
          thelab = thebut.getLabel();
          if ( thelab.equals(Vcr.FWD) ) {
                imginc = 1;
                handled = true;
          } else if ( thelab.equals(Vcr.REV) ) {
                imginc = (-1);
                handled = true;
          } else if ( thelab.equals(Vcr.STOP) ) {
                imginc = 0;
                handled = true;
          } else if ( thelab.equals(Vcr.EJECT) ) {
                imginc = 0;
                done = true;
                stop();
                handled = true;
          }
        }
        return(handled);
  }
}