// Diesmal werden mehr vordefinierte Komponenten verwendet.
// Daher wird vorsichtshalber alles eingebunden. Der Stern *
// steht dabei als Joker für alle jeweils existierenden
// Komponenten.
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

// Dieses Applet wird nach seinem Start noch nichts anzeigen.
// Dafür kann der Benutzer jedoch zur Laufzeit angeben, wie
// viele Quadratzahlen er aufsummiert haben möchte!
public class SumGUI extends Applet
{
    // Da jetzt nicht nur der Bereich  init  verwendet wird,
    // müssen die tatsächlich verwendeten Komponenten schon
    // an dieser Stelle deklariert werden. Nur dann können
    // wir sie auch im Bereich  calculateSum  verwenden.
    TextArea output;

    // Diese neue Komponente hat die Aufgabe Eingaben vom
    // Benutzer entgegen zu nehmen. Der in diesem Textfeld
    // vom Benutzer eingetragene Wert soll dann das Limit
    // der Summation der ersten Quadratzahlen sein.
    TextField inputLimit;

    public void init()
    {
        // Wenn mehrere Komponenten verwendet werden, dann
        // macht es sich besser, diese halbwegs übersichtlich
        // anzuordnen. Das  BorderLayout  lässt uns Bereiche
        // wie oben, unten, links, rechs und mittig ansprechen.
        setLayout(new BorderLayout());

        output=new TextArea(10, 20);

        // Das Layout unseres Applets muss wissen, wo es den
        // Textbereich platzieren soll. Wir geben hier vor,
        // dass es in die (Neue) Mitte soll.
        add(output, BorderLayout.CENTER);

        // Da wir noch drei weitere Komponenten ins Applet
        // packen wollen, gruppieren wir diese zu einer neuen
        // Einheit, einem so genannten Panel (Fach, Feld).
        // Zuerst erzeugen wir ein solches Panel...
        Panel headline=new Panel();

        // ... um es dann, mit seinem späteren Inhalt, oben
        // in unser Applet einzufügen.
        add(headline, BorderLayout.NORTH);

        // Die erste Komponente unseres Kopfzeilen-Panel ist
        // ein Bezeichnungsfeld, welches mit einem Schlagwort
        // die Bedeutung des nachfolgenden Textfeldes andeutet.
        Label labelLimit=new Label("Limit");

        // Dieses Bezeichnungsfeld wird nun zu unserem
        // Kopfzeilen-Panel hinzu gefügt.
        headline.add(labelLimit);








        // Nun wird das Textfeld definiert, in das der Benutzer
        // das Limit seiner Addition eingeben können soll. Es
        // hat genau acht Spalten und ist unter der Bezeichnung
        // inputLimit  in unserem gesamten Applet ansprechbar.
        inputLimit=new TextField(8);

        headline.add(inputLimit);

        // Dem Benutzer wird noch eine Schaltfläche zur Verfügung
        // gestellt, die bei einem Mausklick bewirkt, dass die
        // Quadratzahlensumme bis zu dem in unserem Textfeld
        // aktuell stehenden Limit berechnet wird.
        Button start=new Button("Start!");

        headline.add(start);

        // Da die Schaltfläche nicht automatisch wissen kann,
        // welche Aktionen folgen sollen, wenn sie gedrückt
        // wird, definieren wir hier, dass nach Mausklick an
        // der Stelle  calculateSum  fortgefahren werden soll.
        start.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ae) {
                        calculateSum();
                }
        });
    }

    // Dies ist ein neuer Codebereich (Funktion), der in diesem
    // Applet ausgeführt wird, wenn die Schaltfläche gedrückt
    // wurde.
    private void calculateSum() {

        int sum=0;

        int steps=1;

        // --> Hier ist nun der Knackpunkt: Das Limit ist nicht
        // --> fest im Java-Code verankert, sondern wird aus
        // --> dem Inhalt des unter dem Namen  inputLimit
        // --> ansprechbaren Textfeld gezogen!
        int limit=Integer.valueOf(inputLimit.getText()).intValue();

        // Im Gegensatz zur Uebung nur noch ein Zusatz, um den
        // Code etwas robuster zu machen. Der doppelte ampersand &&
        // steht für eine logische UND Verknüpfung, das heißt alle
        // Bedingungen müssen erfüllt sein, damit in die while-
        // Schleife eingestiegen wird!
        while (steps<=limit && limit>1 && limit<1000)
        {
            sum=sum+(steps*steps);
            steps=steps+1;
        }
        output.append("1*1+...+"+limit+"*"+limit);
        output.append("\n");
        output.append("="+sum);

        // Für eine hübschere Ausgabe ist das hier noch nötig...
        output.append("\n");
    }
}

