/**
 * @version 1.20 1999-04-25
 * @author Cay Horstmann
 */

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class BounceSelfish
{  public static void main(String[] args)
   {  JFrame frame = new BounceSelfishFrame();
      frame.show();
   }
}

class BounceSelfishFrame extends JFrame
{  public BounceSelfishFrame()
   {  setSize(300, 200);
      setTitle("Bounce");

      addWindowListener(new WindowAdapter()
         {  public void windowClosing(WindowEvent e)
            {  System.exit(0);
            }
         } );

      Container contentPane = getContentPane();
      canvas = new JPanel();
      contentPane.add(canvas, "Center");
      JPanel p = new JPanel();
      addButton(p, "Start",
         new ActionListener()
         {  public void actionPerformed(ActionEvent evt)
            {  Ball b = new Ball(canvas, Color.black);
               b.setPriority(Thread.NORM_PRIORITY-2);
               b.start();
            }
         });

      addButton(p, "Selfish",
         new ActionListener()
         {  public void actionPerformed(ActionEvent evt)
            {  Ball b = new SelfishBall(canvas, Color.blue);
               b.setPriority(Thread.NORM_PRIORITY + 3);
               b.start();
            }
         });

      addButton(p, "Close",
         new ActionListener()
         {  public void actionPerformed(ActionEvent evt)
            {  canvas.setVisible(false);
               System.exit(0);
            }
         });
      contentPane.add(p, "South");
   }

   public void addButton(Container c, String title,
      ActionListener a)
   {  JButton b = new JButton(title);
      c.add(b);
      b.addActionListener(a);
   }

   private JPanel canvas;
}

class Ball extends Thread
{  public Ball(JPanel b, Color c) { box = b; color = c; }

   public void draw()
   {  Graphics g = box.getGraphics();
      g.setColor(color);
      g.fillOval(x, y, XSIZE, YSIZE);
      g.dispose();
   }

   public void move()
   {  if (!box.isVisible()) return;
      Graphics g = box.getGraphics();
      g.setColor(color);
      g.setXORMode(box.getBackground());
      g.fillOval(x, y, XSIZE, YSIZE);
      x += dx;
      y += dy;
      Dimension d = box.getSize();
      if (x < 0)
      { x = 0; dx = -dx; }
      if (x + XSIZE >= d.width)
      { x = d.width - XSIZE; dx = -dx; }
      if (y < 0)
      { y = 0; dy = -dy; }
      if (y + YSIZE >= d.height)
      { y = d.height - YSIZE; dy = -dy; }
      g.fillOval(x, y, XSIZE, YSIZE);
      g.dispose();
   }

   public void run()
   {  try
      {  draw();
         for (int i = 1; i <= 1000; i++)
         {  move();
            sleep(5);
         }
      }
      catch(InterruptedException e) {}
   }

   private JPanel box;
   private static final int XSIZE = 10;
   private static final int YSIZE = 10;
   private int x = 0;
   private int y = 0;
   private int dx = 2;
   private int dy = 2;
   private Color color;
}

class SelfishBall extends Ball
{  public SelfishBall(JPanel b, Color c) { super(b, c); }

   public void run()
   {  draw();
      for (int i = 1; i <= 1000; i++)
      {  move();
         long t = System.currentTimeMillis();
         while (System.currentTimeMillis() < t + 5)
            ;
      }
   }
}

