Titel   Inhalt   Suchen   Index   DOC  Handbuch der Java-Programmierung, 7. Auflage
 <<    <     >    >>   API  Kapitel 40 - Applets I

40.1 Die Architektur eines Applets



40.1.1 Grundlagen

Auf die Funktionsweise und Bedeutung von Applets sind wir schon in Abschnitt 1.2.2 eingegangen. Tatsächlich stand in den ersten Jahren nach Veröffentlichung der Sprache für viele Java-Programmierer die Entwicklung von Applets im Vordergrund und war einer der Hauptgründe für die Beschäftigung mit der Sprache.

Später gewann Java dann zunehmend auch als Sprache für die Anwendungsentwicklung an Bedeutung und die Programmierung von Applets trat mehr und mehr in den Hintergrund. Dennoch werden auch heute noch Applets entwickelt und als Java-Programmierer sollte man die dazu erforderlichen Techniken beherrschen.

Glücklicherweise 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, dass 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 wie folgt zusammenfassen:

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 24 bis 34 des Buchs vermittelten AWT-Features auf, ohne deren Kenntnis die Applet-Programmierung kaum möglich wäre.

40.1.2 Die Klasse java.applet.Applet

Wie schon erwähnt, wird das Hauptprogramm eines Applets aus der Klasse Applet des Pakets java.applet abgeleitet. Applet ist dabei 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 40.1 stellt die Ableitungshierarchie schematisch dar:

Abbildung 40.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 natürlich sehr entgegen, ein eigenständiges Programm zu sein, das innerhalb eines fensterartigen Ausschnitts in einem grafikfähigen Web-Browser läuft. 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.

40.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, muss 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.

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 Webseite lädt, wird das Applet nicht komplett zerstört, sondern lediglich gestoppt (siehe nächsten Abschnitt). Bei wiederholtem Aufruf der Seite wird es dann erneut gestartet und die Methode start wird noch einmal aufgerufen.

Stoppen des Applets

Durch Aufrufen der Methode stop zeigt der Browser dem Applet an, dass 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.

40.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 /* Listing4001.java */
002 
003 import java.awt.*;
004 import java.applet.*;
005 
006 public class Listing4001
007 extends Applet
008 {
009   public void paint(Graphics g)
010   {
011     showStatus("Hello, world");
012     g.drawString("Hello, world",10,50);
013   }
014 }
Listing4001.java
Listing 40.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, dass 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 40.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 40.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, dass 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-2011 Guido Krueger";
004 }
Listing 40.3: Die Methode getAppletInfo


 Titel   Inhalt   Suchen   Index   DOC  Handbuch der Java-Programmierung, 7. Auflage, Addison Wesley, Version 7.0
 <<    <     >    >>   API  © 1998, 2011 Guido Krüger & Heiko Hansen, http://www.javabuch.de