import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Programm6 extends Applet implements ActionListener, ItemListener {
  Button Knopf1 = new Button("Neue Scheibe"),
         Knopf2 = new Button("Scheiben löschen");
  Checkbox Box = new Checkbox("Gravitation");
  Leinwand L = new Leinwand();

  public Programm6() {
    add(L);
    Panel Bereich2 = new Panel();
    add(Bereich2);
    Bereich2.add(Knopf1);
    Bereich2.add(Box);
    Bereich2.add(Knopf2);
    Knopf1.addActionListener(this);
    Knopf2.addActionListener(this);
    Box.addItemListener(this);
  }
  
  public void actionPerformed(ActionEvent Ereignis) {
    if(Ereignis.getActionCommand() == "Neue Scheibe") L.neueScheibe();
    if(Ereignis.getActionCommand() == "Scheiben löschen") L.loescheScheiben();
  }

  public void itemStateChanged(ItemEvent Ereignis) {
    if(Ereignis.getItemSelectable().equals(Box)) L.aendereGravitation();
  }
}

class Leinwand extends Canvas {
  Kreisscheibe[] Kreise = new Kreisscheibe[10];
  int zaehler=0;
  boolean gravitation=false;

  public Leinwand() {
    setBackground(Color.GREEN);
    setSize(400,200);
  }

  public void neueScheibe() {
    if(zaehler>=10) return;
    Kreisscheibe Kreis = new Kreisscheibe(getGraphics(),50,50,gravitation);
    Kreise[zaehler++]=Kreis;
    Kreis.start();
  }

  public void loescheScheiben() {
    for(int i=0;i<zaehler;i++) Kreise[i].halt();
    zaehler=0;
  }
  
  public void aendereGravitation() {
    gravitation=!gravitation;
    for(int i=0;i<zaehler;i++) Kreise[i].aendereGravitation();
  }
}

class Kreisscheibe extends Thread {
  Graphics Stift;
  int x, y, r, vx, vy;
  boolean halt, gravitation;

  public Kreisscheibe(Graphics g,int x,int y,boolean gravitation) {
    r=20; vx=1; vy=1; halt=false;
    Stift=g; this.x=x; this.y=y; this.gravitation=gravitation;
  }

  public void zeichneDich() {
    Stift.setColor(Color.GREEN);
    Stift.fillOval(x-r,y-r,2*r,2*r);
    x += vx; y += vy;
    if(gravitation && y<180 && y>20) vy++;
    if(y>180 || y<20) vy=-vy;
    if(x>380 || x<20) vx=-vx;
    Stift.setColor(Color.BLUE);
    Stift.fillOval(x-r,y-r,2*r,2*r);
  }
  
  public void zeitschleife() {
    try { sleep(20); }
    catch(InterruptedException Fehler) { return; }
  }

  public void run() {
    while(halt==false) {
      zeichneDich();
      zeitschleife();
    }
    Stift.setColor(Color.GREEN);
    Stift.fillOval(x-r,y-r,2*r,2*r);
  }
  
  public void aendereGravitation() {
    gravitation=!gravitation;
  }

  public void halt() {
    halt=true;
  }
}

