# Von Java-Application zum Java-Applet



## MSJones (19. Jul 2004)

Ich hab hier ne eine Classe, die mit aus einer Gleichung einen polnische Notation macht und diese dann in einen Baum schreibt.

Jetzt möchte ich den Baum in einem Applet ausgeben.

Das Problem dabei:
Ich hab mir ein Testapplet geschrieben, ohne übergabewerte, einfach ein Applet, daß mir einen voll gefüllten Baum zeichnet.
Dazu hab ich folgende Methode zum zeichnen der Elemente benutzt:

```
public void elementMalen(Graphics g, int ebene, int number, Color kColor, String str)
```
(x wird aus number berechnet und y aus ebene)

Das Testapplet läuft einwandfrei, nur ich hab das Problem, wich ich dann die Baumelemente zeichnen kann!
Das Problem liegt entweder darin, daß ich gesagt bekomme, daß Elementzeichnen keine statische Mehthode ist (iss klar) oder wenn ich ein Attribut anlege, dann liegt das Problem darin, woher ich dieses "Graphics g" herbekomme. Das wird nirgends initiert oder so, also kann ich das auch net übergeben!

Im prinzip ist meine Frage ganz einfach:
Wie schrieb ich diesen Baum mit der oben genannten Methode in ein Applet?


----------



## L-ectron-X (19. Jul 2004)

Ein Graphics-Objekt kann mit...

```
Graphics g = getGraphics();
```
...beschafft werden.
Um auf ein Applet (Panel) zu zeichnen muss in das Applet die Methode

```
public void paint(Graphics g)
```
eingefügt werden.
Ein wenig mehr Code von Deinem Applet wäre schön gewesen.


----------



## MSJones (19. Jul 2004)

OK, also Baum erstellen iss kein Problem.
Hier meine Applet-Klasse:

```
//Imports für Applets:
import java.applet.*;
import java.awt.*;

/**
 * Mein kleines Test-Applet
 * 
 * @author Marko "Kiroken" Rosar
 * @version 14.07.2004
 */
public class TestApplet extends Applet {

    // Konstanten:
    private static String STATUS_GESTARTET = "Applet gestartet";
    private static String STATUS_GESTOPT = "Applet gestopt";
     
    // Attribute:
    private Color bgColor = Color.LIGHT_GRAY; //Hintergrundfarbe
    private Color raColor = Color.DARK_GRAY; //Randfarbe
    int raBreite = 2; //Randbreite
    private String programmStatus = "";  
    
    
    /**
     * Diese Methode wird beim Ausführen des Applets aufgerufen.
     * Sie initialisiert das Applet.
     */
    public void init() {
    }
    
    
    /**
     * Diese Methode wird immer dann aufgerufen, wenn das Applet
     * teilweise oder gänzlich neu gezeichnet werden muss.
     * 
     * param g Eine Abstrakte Klasse mit jeder menge statischer Methoden zum Zeichnen
     */
    public void paint(Graphics g) {
        // Statuszeile schreiben:
        showStatus(programmStatus);
        //Rand Malen:
        g.setColor(raColor);
        g.fillRect(0,0,getWidth(),getHeight());
        // Innenbereich Malen:
        g.setColor(bgColor);
        g.fillRect(raBreite,raBreite,getWidth()-(2*raBreite),getHeight()-(2*raBreite));
        // Überschrift:
        Font f = new Font("SansSerif",Font.BOLD,16);
        g.setFont(f);
        g.drawString("Kirokens Applet",50,40);
        // Kreis malen BSP:
        Color c = Color.BLUE;
        int maxAnz = 1;
        int kante = 20;
        String str = "-";
        for (int testE = 1; testE <= 6; testE++) {
            if (testE == 1) str = "-";
            if (testE == 2) str = "+";
            if (testE == 3) str = "*";
            if (testE == 4) str = "/";
            if (testE == 5) str = "^";
            // Maximale Anzahl der Elemente auf dieser Ebene:
            maxAnz = 1;
            for (int i=2; i<= testE; i++) maxAnz *= 2;  
            for (int testA = 1; testA <= maxAnz; testA++) 
                elementMalen(g, testE, testA, kante, testE*50, c, str);
        }

    }
    
    
    /**
     * Diese Methode wird aufgerufen, wenn das Applet zerstört wird.
     * Hier können Aufräumarbeiten geschehen.
     */
    public void destroy() {
        
    }
    
    
    /**
     * Mit dieser Methode können Baum-Elemente auf dem Applet gezeichnet werden.
     * 
     * @param g Grafik, auf der das Element gezeichnet wird
     * @param ebene Die Ebene eines Baumes, auf der sich das Element befinden soll
     * @param number Die Nummer des zu zeichnenden Elementes
     * @param k Die Kantenlänge des Elementes
     * @param y Die y-Achse auf der das Element gezeichnet werden soll
     * @param kColor Die Farbe des zu zeichnenden Elementes
     * @param str Beschriftung des Elementes
     */
    public void elementMalen(Graphics g, int ebene, int number, int kante, int y, Color kColor, String str) {
        // Maximale Anzahl der Elemente auf dieser Ebene:
        int maxAnz = 1;
        for (int i=2; i<= ebene; i++) maxAnz *= 2;      
        // Abbrechen ohne zu Zeichnen, wenn Elementnummer > maximale Anzahl
        if (number > maxAnz) return;
        // Abbrechen wenn das Element nicht gezeichnet werden kann:
        if (y < 0) return;
        // Abstand der Kreise von einander:
//      int elementabstand = getWidth() / (maxAnz+1);
        int temp = 1;
        for (int i=1; i<= ebene; i++) temp *= 2;
        int elementabstand = getWidth() / temp;
        // Element zeichnen:
        int x = elementabstand * (number-1) * 2 + elementabstand - k/2;
        g.setColor(kColor);
        g.drawRoundRect(x,y,k,k,5,5);
        Font f = new Font("SansSerif",Font.TRUETYPE_FONT,14);
        g.setFont(f);
        g.drawString(str,x+6,y+15);
    }
    
    
    /**
     * Diese Methode wird aufgerufen, wenn der Browser das Applet
     * stopt, aber nicht zerstört. 
     */
    public void stop() {
        // Status aktuallisieren: 
        programmStatus = STATUS_GESTOPT;
        
    }
    
    
    /**
     * Diese Methode wird aufgerufen, wenn der Browser das Applet
     * wieder aktiviert. 
     */
    public void start() {
        // Status aktuallisieren:
        programmStatus = STATUS_GESTARTET;
    }
}
```

und jetzt soll da noch irgendwo eine Methode rein, der ich einen Baum übergebe und der mir den Baum dann ins Applet zeichnet!


----------



## L-ectron-X (19. Jul 2004)

Ich habe zwei oder drei kleinere Fehler beseitigt.
Aus so richtig "schönem" Code besteht Deine Applet-Klasse aber nicht. Daran kannst Du ja noch feilen. Auf jeden Fall funktioniert sie jetzt.

```
//Imports für Applets:
import java.applet.*;
import java.awt.*;

/**
* Mein kleines Test-Applet
*
* @author Marko "Kiroken" Rosar
* @version 14.07.2004
*/
public class TestApplet extends Applet {

    // Konstanten:
    private static String STATUS_GESTARTET = "Applet gestartet";
    private static String STATUS_GESTOPT = "Applet gestopt";

    // Attribute:
    private Color bgColor = Color.LIGHT_GRAY; //Hintergrundfarbe
    private Color raColor = Color.DARK_GRAY; //Randfarbe
    int raBreite = 2; //Randbreite
    private String programmStatus = "";

    private Font f;


    /**
     * Diese Methode wird beim Ausführen des Applets aufgerufen.
     * Sie initialisiert das Applet.
     */
    public void init() {
       f = new Font("SansSerif",Font.BOLD,16);
    }


    /**
     * Diese Methode wird immer dann aufgerufen, wenn das Applet
     * teilweise oder gänzlich neu gezeichnet werden muss.
     *
     * param g Eine Abstrakte Klasse mit jeder menge statischer Methoden zum Zeichnen
     */
    public void paint(Graphics g) {
        // Statuszeile schreiben:
        showStatus(programmStatus);
        //Rand Malen:
        g.setColor(raColor);
        g.fillRect(0,0,getWidth(),getHeight());
        // Innenbereich Malen:
        g.setColor(bgColor);
        g.fillRect(raBreite,raBreite,getWidth()-(2*raBreite),getHeight()-(2*raBreite));
        // Überschrift:

        g.setFont(f);
        g.setColor(Color.black);
        g.drawString("Kirokens Applet",50,40);
        // Kreis malen BSP:
        Color c = Color.BLUE;
        int maxAnz = 1;
        int kante = 20;
        String str = "-";
        for (int testE = 1; testE <= 6; testE++) {
            if (testE == 1) str = "-";
            if (testE == 2) str = "+";
            if (testE == 3) str = "*";
            if (testE == 4) str = "/";
            if (testE == 5) str = "^";
            // Maximale Anzahl der Elemente auf dieser Ebene:
            maxAnz = 1;
            for (int i=2; i<= testE; i++) maxAnz *= 2;
            for (int testA = 1; testA <= maxAnz; testA++)
                elementMalen(g, testE, testA, kante, testE*50, c, str);
        }

    }


    /**
     * Diese Methode wird aufgerufen, wenn das Applet zerstört wird.
     * Hier können Aufräumarbeiten geschehen.
     */
    public void destroy() {

    }


    /**
     * Mit dieser Methode können Baum-Elemente auf dem Applet gezeichnet werden.
     *
     * @param g Grafik, auf der das Element gezeichnet wird
     * @param ebene Die Ebene eines Baumes, auf der sich das Element befinden soll
     * @param number Die Nummer des zu zeichnenden Elementes
     * @param k Die Kantenlänge des Elementes
     * @param y Die y-Achse auf der das Element gezeichnet werden soll
     * @param kColor Die Farbe des zu zeichnenden Elementes
     * @param str Beschriftung des Elementes
     */
    public void elementMalen(Graphics g, int ebene, int number, int kante, int y, Color kColor, String str) {
        // Maximale Anzahl der Elemente auf dieser Ebene:
        int maxAnz = 1;
        for (int i=2; i<= ebene; i++) maxAnz *= 2;
        // Abbrechen ohne zu Zeichnen, wenn Elementnummer > maximale Anzahl
        if (number > maxAnz) return;
        // Abbrechen wenn das Element nicht gezeichnet werden kann:
        if (y < 0) return;
        // Abstand der Kreise von einander:
//      int elementabstand = getWidth() / (maxAnz+1);
        int temp = 1;
        for (int i=1; i<= ebene; i++) temp *= 2;
        int elementabstand = getWidth() / temp;
        // Element zeichnen:
        int x = elementabstand * (number-1) * 2 + elementabstand - kante/2;
        g.setColor(kColor);
        g.drawRoundRect(x,y,kante,kante,5,5);
        f = new Font("SansSerif",Font.TRUETYPE_FONT,14);
        g.setFont(f);
        g.drawString(str,x+6,y+15);
    }


    /**
     * Diese Methode wird aufgerufen, wenn der Browser das Applet
     * stopt, aber nicht zerstört.
     */
    public void stop() {
        // Status aktuallisieren:
        programmStatus = STATUS_GESTOPT;

    }


    /**
     * Diese Methode wird aufgerufen, wenn der Browser das Applet
     * wieder aktiviert.
     */
    public void start() {
        // Status aktuallisieren:
        programmStatus = STATUS_GESTARTET;
    }
}
```


----------



## MSJones (19. Jul 2004)

Bei mir hat das Applet vorher auch schon funktioniert!

Aber ich kann das Applet immer noch nicht aus einer Java-Application aus aufrufen!


----------



## L-ectron-X (19. Jul 2004)

Zunächst mal kann ich gar nicht glauben, dass das Applet bei Dir lief (zumindest nicht in der von Dir geposteten Version), denn ich bekam beim Kompilieren vom Compiler erst mal einige Fehler präsentiert.
Und zweitens war davon, dass Du das Applet von einer Applikation aus aufrufen möchtest, nie die Rede.

Applets "leben" normaler Weise in Browsern. Es gibt jedoch auch die Möglichkeit sie als Panel einem Frame hinzuzufügen. Das geht in den meisten Fällen, in dem man vom Applet eine Instanz erzeugt, die init()-Methode des Applets aufruft und es dem Frame hinzufügt _add(appletInstanz);_.
Falls das nicht die Antwort auf Deine Frage war, solltest Du Dein Vorhaben bitte etwas genauer schildern.


----------

