import java.awt.*;
import java.applet.*;
import java.awt.event.*;

/* A very simple applet that demonstrates the simplest animation techniques.
No attempt is made here to reduce or eliminate flicker. The animation just
sends a white rectangle back and forth (horizontally) across a canvas.
*/
public class AnimJava extends Applet implements ActionListener
{
   Button start, stop; // stop and start the animation
   xCanvas can; // custom canvas on which to draw
   Panel controls; // holds the buttons

//************************************************
public void init()
{
   start = new Button("Start");
   start.addActionListener(this);
   stop = new Button("Stop");
   stop.addActionListener(this);

   controls = new Panel();
   controls.setLayout ( new GridLayout(1,2));

   can = new xCanvas();
   can.setBackground(Color.black);

   this.setLayout ( new BorderLayout());

   controls.add(start);
   controls.add(stop);

   add(controls, BorderLayout.NORTH);
   add(can, BorderLayout.CENTER);

} // end of init

//************************************************
//Respond to button clicks by calling methods in the custom
//canvas to start and stop the animation

public void actionPerformed (ActionEvent e)
{
   if (e.getSource() == start)
     can.startAnim();


   if (e.getSource() == stop)
     can.stopAnim();
}
   
} // end applet class

//************************************************
//Custom canvas class implements runnable so must have a run method

class xCanvas extends Canvas implements Runnable
{
   Thread runner = null;
   int x = 30; //hard coding opening coordinates of rectangle
   int y = 100;
   int w = 20;
   int incr = 4;

   boolean black = true; //for controlling color
   boolean keepDrawing; //for controlling run loop
   
//************************************************
//Constructor does nothing special
public xCanvas()
{
   super();
}
//************************************************
//Called by parent applet, this starts the thread's code

public void startAnim()
{
   if (runner == null)
  {
     runner = new Thread(this);
     keepDrawing = true;
     runner.start();
   }
}

//************************************************
//Called by parent applet, this stops the thread's code
public void stopAnim()
{
   if (runner != null)
  {
      keepDrawing = false;
      runner = null;
  }
}


//************************************************
//The thread's code runs here

public void run()
{
   Dimension d = getSize();

   while (keepDrawing)
   {
      if ((x + w) > d.width ) //if rectangle at right border
      incr = -incr; //change direction

      if (x <= 0) //if rectangle at left border
      incr = -incr; //change direction

      x+= incr; //add to current x coordinate

      repaint(); //call paint

      try
     {
        runner.sleep(10); //sleep a little to slow it down
     }
     catch (InterruptedException e) {}

  }
} // end of run


//************************************************

public void paint(Graphics g)
{
   if (black) //toggle current drawing color
      g.setColor(Color.white);
   else
     g.setColor(Color.black);
     black = !black;
     g.fillRect(x, y, w, w);
} // end paint

} // end of class