Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage
<< | < | > | >> | API | Kapitel 39 - Applets I

## 39.1 Die Architektur eines Applets

- 39.1 Die Architektur eines Applets
  - 39.1.1 Grundlagen
  - 39.1.2 Die Klasse java.awt.Applet
  - 39.1.3 Initialisierung und Endebehandlung
    - Instanzierung des Applets
    - Initialisierung des Applets
    - Starten des Applets
    - Stoppen des Applets
    - Zerstören des Applets
  - 39.1.4 Weitere Methoden der Klasse Applet
    - Methoden zum Nachrichtentransfer
    - showStatus
    - getParameterInfo
    - getAppletInfo

### 39.1.1 Grundlagen

Für viele Leser, die Java lernen wollen, steht die Entwicklung von Applets im Vordergrund und ist der Hauptgrund für die Beschäftigung mit der Sprache. In letzter Zeit ist allerdings ein Trend zu beobachten, bei dem Java zunehmend auch als Sprache für die Anwendungsentwicklung an Bedeutung gewinnt. Daß man mit Java auch Web-Pages verschönern kann, ist dabei ein angenehmer Nebeneffekt.

Tatsächlich unterscheiden sich Applets und Applikationen gar nicht so stark voneinander, wie man vermuten könnte. Bis auf wenige Ausnahmen werden sie mit denselben Werkzeugen und Techniken konstruiert. Vereinfacht kann man sagen, daß Java-Applikationen eigenständige Programme sind, die zur Ausführung den Stand-Alone-Java-Interpreter benötigen, während Java-Applets aus HTML-Seiten heraus aufgerufen werden und zur Ausführung einen Web-Browser benötigen.

Die wichtigsten Unterschiede kann man in einer kurzen Liste zusammenfassen:

- Das Hauptprogramm eines Applets wird immer aus der Klasse `Applet` abgeleitet. Bei einer Applikation ist es prinzipiell gleichgültig, woraus die Hauptklasse abgeleitet wird.
- Eine Applikation wird gestartet, indem vom Java-Interpreter die Klassenmethode `main` aufgerufen wird. Das Starten eines Applets wird dadurch erreicht, daß der Web-Browser die Applet-Klasse instanziert und die Methoden `init` und `start` aufruft.
- Aus Sicherheitsgründen darf ein Applet in der Regel weder auf Dateien des lokalen Rechners zugreifen noch externe Programme auf diesem starten. Eine Ausnahme bilden signierte Applets. Für eine Applikation gelten diese Beschränkungen nicht.
- Ein Applet arbeitet immer grafik- und ereignisorientiert. Bei einer Applikation dagegen ist es möglich, auf die Verwendung des AWT zu verzichten und alle Ein-/Ausgaben textorientiert zu erledigen.
- Applets bieten einige zusätzliche Möglichkeiten im Bereich des Benutzerschnittstellen-Designs, die so bei Applikationen nicht ohne weiteres zu finden sind. Die Ausgabe von Sound beispielsweise ist standardmäßig auf Applets beschränkt.

Dieses Kapitel erklärt die Grundlagen der Applet-Programmierung und erläutert die Einbindung von Applets in HTML-Dokumente. Es baut dabei auf vielen der in den Kapiteln 23 bis 34 des Buches vermittelten AWT-Features auf, ohne deren Kenntnis die Applet-Programmierung kaum möglich wäre.

### 39.1.2 Die Klasse java.awt.Applet

Wie schon erwähnt, wird das Hauptprogramm eines Applets aus der Klasse `Applet` des Pakets `java.applet` abgeleitet. `Applet` ist nun aber keine der abstrakten Basisklassen der Java-Klassenbibliothek, wie man es vielleicht erwarten würde, sondern eine konkrete Grafikklasse am Ende der Klassenhierarchie. `Applet` ist aus der Klasse `Panel` abgeleitet, diese aus `Container` und `Container` aus `Component`. Abbildung 39.1 stellt die Ableitungshierarchie schematisch dar:

Abbildung 39.1: Ableitungsbaum der Applet-Klasse

Ein Applet ist also ein rechteckiges Bildschirmelement, das eine Größe und Position hat, Ereignisse empfangen kann und in der Lage ist, grafische Ausgaben vorzunehmen. Tatsächlich kommt dies dem Anspruch eines Applets, ein eigenständiges Programm zu sein, das innerhalb eines fensterartigen Ausschnitts in einem grafikfähigen Web-Browser läuft, sehr entgegen. Durch die Vererbungshierarchie erbt ein Applet bereits von seinen Vaterklassen einen großen Teil der Fähigkeiten, die es zur Ausführung benötigt. Die über die Fähigkeiten von `Container`, `Component` und `Panel` hinaus erforderliche Funktionalität, die benötigt wird, um ein Objekt der Klasse `Applet` als Hauptmodul eines eigenständigen Programms laufen zu lassen, wird von der Klasse `Applet` selbst zur Verfügung gestellt.

### 39.1.3 Initialisierung und Endebehandlung

Die Kommunikation zwischen einem Applet und seinem Browser läuft auf verschiedenen Ebenen ab. Nach dem Laden wird das Applet zunächst instanziert und dann initialisiert. Anschließend wird es gestartet, erhält GUI-Events und wird irgendwann wieder gestoppt. Schließlich wird das Applet vom Browser nicht mehr benötigt und zerstört.

Zu jedem dieser Schritte gibt es eine korrespondierende Methode, die vor dem entsprechenden Statuswechsel aufgerufen wird. Die aus `Applet` abgeleitete Klasse ist dafür verantwortlich, diese Methoden zu überlagern und mit der erforderlichen Funktionalität auszustatten.

#### Instanzierung des Applets

Bevor ein Applet aktiv werden kann, muß der Browser zunächst ein Objekt der abgeleiteten `Applet`-Klasse instanzieren. Hierzu ruft er den parameterlosen Default-Konstruktor der Klasse auf:

    public Applet()
| java.applet.Applet

Üblicherweise wird dieser in der abgeleiteten Klasse nicht überlagert, sondern von `Applet` geerbt. Notwendige Initialisierungen von Membervariablen werden später erledigt.

#### Initialisierung des Applets

Nach der Instanzierung ruft der Browser die Methode `init` auf, um dem Applet die Möglichkeit zu geben, Initialisierungen vorzunehmen:

    public void init()
| java.applet.Applet

|  | `init` wird während der Lebensdauer eines Applets genau einmal aufgerufen, nachdem die Klassendatei geladen und das Applet instanziert wurde. Innerhalb von `init` können Membervariablen initialisiert, Images oder Fonts geladen oder Parameter ausgewertet werden. |  |
Hinweis

#### Starten des Applets

Nachdem die Initialisierung abgeschlossen ist, wird die Methode `start` aufgerufen, um die Ausführung des Applets zu starten:

    public void start()
| java.applet.Applet

|  | Im Gegensatz zur Initialisierung kann das Starten eines Applets mehrfach erfolgen. Wenn der Browser eine andere Web-Seite lädt, wird das Applet nicht komplett zerstört, sondern lediglich gestoppt (siehe nächsten Abschnitt). Bei erneutem Aufruf der Seite wird es dann wieder gestartet und die Methode `start` erneut aufgerufen. |  |
Hinweis

#### Stoppen des Applets

Durch Aufrufen der Methode `stop` zeigt der Browser dem Applet an, daß es gestoppt werden soll:

    public void stop()
| java.applet.Applet

Wie erwähnt, geschieht dies immer dann, wenn eine andere Seite geladen wird. Während der Lebensdauer eines Applets können die Methoden `start` und `stop` also mehrfach aufgerufen werden. Keinesfalls darf ein Applet also innerhalb von `stop` irgendwelche endgültigen Aufräumarbeiten durchführen und Ressourcen entfernen, die es bei einem nachträglichen Neustart wieder benötigen würde.

#### Zerstören des Applets

Wenn ein Applet ganz bestimmt nicht mehr gebraucht wird (z.B. weil der Browser beendet wird), ruft der Browser die Methode `destroy` auf:

    public void destroy()
| java.applet.Applet

Diese kann überlagert werden, um Aufräumarbeiten zu erledigen, die erforderlich sind, wenn das Applet nicht mehr verwendet wird. Eine typische Anwendung von `destroy` besteht beispielsweise darin, einen Thread zu zerstören, der bei der Initialisierung eines Applets angelegt wurde.

### 39.1.4 Weitere Methoden der Klasse Applet

#### Methoden zum Nachrichtentransfer

Neben diesen vier speziellen Methoden kann ein Applet alle Nachrichten erhalten, die an ein `Component`-Objekt versendet werden. Hierzu zählen Mouse-, MouseMotion-, Key-, Focus- und Component-Events ebenso wie die Aufforderung an das Applet, seine Client-Area neu zu zeichnen. Bezüglich Reaktion auf die Events und die Registrierung und Programmierung geeigneter Listener-Klassen verhält sich ein Applet genauso wie jedes andere Fenster. In Kapitel 28 und Kapitel 29 wurden die möglichen Ereignisse und die Reaktion des Programms darauf vorgestellt.

#### showStatus

Mit der Methode `showStatus` kann das Applet einen Text in die Statuszeile des HTML-Browsers schreiben, der das Applet ausführt:

    public void showStatus(String msg)
| java.applet.Applet

Das folgende Beispiel zeigt ein sehr einfaches Applet, das den Text »Hello, world« auf dem Bildschirm ausgibt und in die Statuszeile des Browsers schreibt:

    001 /* Listing3901.java */
    002
    003 import java.awt.*;
    004 import java.applet.*;
    005
    006 public class Listing3901
    007 extends Applet
    008 {
    009   public void paint(Graphics g)
    010   {
    011     showStatus("Hello, world");
    012     g.drawString("Hello, world",10,50);
    013   }
    014 }
| Listing3901.java

Listing 39.1: Ein einfaches Applet

#### getParameterInfo

Die Klasse `Applet` besitzt eine Methode `getParameterInfo`, die in abgeleiteten Klassen überlagert werden sollte:

    public String[][] getParameterInfo()
| java.applet.Applet

`getParameterInfo` kann vom Browser aufgerufen werden, um Informationen über die vom Applet akzeptierten Parameter zu erhalten. Der Rückgabewert von `getParameterInfo` ist ein zweidimensionales Array von Strings. Jedes Element des Arrays beschreibt einen Parameter des Applets durch ein Subarray mit drei Elementen. Das erste Element gibt den Namen des Parameters an, das zweite seinen Typ und das dritte eine textuelle Beschreibung des Parameters. Die Informationen sollten so gestaltet sein, daß sie für menschliche Benutzer verständlich sind; eine programmgesteuerte Verwendung ist eigentlich nicht vorgesehen.

Das nachfolgende Listing zeigt eine beispielhafte Implementierung der Methode `getParameterInfo` für das Applet in Listing 39.5:

    001 public String[][] getParameterInfo()
    002 {
    003   String ret = {
    004     {"redwidth","int","Breite eines roten Segments"},
    005     {"whitewidth","int","Breite eines weissen Segments"}
    006   };
    007   return ret;
    008 }

Listing 39.2: Verwendung von getParameterInfo

#### getAppletInfo

Ähnlich der Methode `getParameterInfo` gibt es eine Methode `getAppletInfo`, mit der die Anwendung Informationen über das Applet zur Verfügung stellen sollte:

    public String getAppletInfo()
| java.applet.Applet

Die Sprachspezifikation gibt an, daß hier ein String zurückgegeben werden sollte, der Angaben zum Applet selbst, zur aktuellen Version und zum Autor des Applets macht. Eine beispielhafte Implementierung könnte so aussehen:

    001 public String getAppletInfo()
    002 {
    003   return "AppletBeispiel Ver. 1.0 (C) 1997-99 Guido Krueger";
    004 }

Listing 39.3: Die Methode getAppletInfo

Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage, Addison Wesley, Version 3.0
<< | < | > | >> | API | © 1998-2002 Guido Krüger, http://www.javabuch.de