Programmieren in Java: Aufbau


Kapitel 7: Java-Applets


Inhaltsverzeichnis

Dieses Buch ist unter einer Creative Commons-Lizenz lizensiert.


7.1 Allgemeines

Ausreizen aller Möglichkeiten der Applet-Programmierung

Die Klasse java.applet.Applet kennen Sie bereits aus vielen Beispielen. In diesem Kapitel soll die Klasse umfangreich vorgestellt werden, damit Sie alle Möglichkeiten, die die Applet-Programmierung bietet, ausschöpfen können.

Sie lernen in diesem Kapitel außerdem das Interface java.applet.AppletContext kennen. Bei diesem Interface handelt es sich um eine Zugriffsmöglichkeit auf den Kontext, also die Umgebung, in der das Applet läuft. Das ist für gewöhnlich der Browser, kann jedoch auch ein anderes Programm sein. Indem Sie auf ein Objekt vom Typ java.applet.AppletContext zugreifen, können Sie Funktionen des Programms aufrufen, in dem das Applet läuft. So können Sie beispielsweise ein neues Browser-Fenster öffnen und darin eine Webseite anzeigen.

Den applet-Tag zum Einbinden von Java-Applets in Webseiten kennen Sie ebenfalls schon - nicht aber all die Parameter, über die Sie die Java-Einbindung perfektionieren können.

Sie erfahren außerdem, wie Sie sogenannte Archive erstellen. Mit Hilfe von Archiven können Sie die Dateigröße Ihres Java-Applets verringern und Downloadzeiten teilweise enorm reduzieren. Leider gibt es hier zwei unterschiedliche Lösungen: Der Microsoft Internet Explorer verwendet CAB-Archive, alle anderen Browser JAR-Archive. Sie lernen jedoch, beide Archiv-Typen zu erstellen, um jeden Browser optimal zu unterstützen.


7.2 java.applet.Applet

Was Sie mit Applets alles tun können

Die Klasse java.applet.Applet ist, wie Sie wissen, in die offizielle Java-Klassenhierarchie eingeordnet. Um sich anzusehen, was man mit Applets alles tun kann, reicht also der Blick in die Dokumentation von java.applet.Applet nicht. Sie müssen sich außerdem die Eltern-Klassen ansehen, weil java.applet.Applet von diesen eine ganze Reihe wichtiger Methoden vererbt bekommt.

Die Vererbungslinie von java.applet.Applet sieht wie folgt aus.

  • java.lang.Object ist die oberste Klasse, von der alle Klassen der Java-Klassenhierarchie abgeleitet sind.

  • java.awt.Component ist von java.lang.Object abgeleitet. Diese Klasse stellt eine grafische Repräsentation eines Objekts dar. Klassen, die von java.awt.Component abgeleitet sind, besitzen die Fähigkeit, am Bildschirm angezeigt werden zu können.

  • java.awt.Container ist von java.awt.Component abgeleitet. Diese Klasse macht es möglich, andere AWT-Klassen in sich aufzunehmen. Das heißt, diese anderen AWT-Klassen werden innerhalb der Container-Klasse am Bildschirm angezeigt.

  • java.awt.Panel ist von java.awt.Container abgeleitet. Diese Klasse ist eine Spezialisierung von java.awt.Container. Diese Spezialisierung ist jedoch nicht gerade berauschend. java.awt.Panel definiert nur eine einzige Methode, die Sie für gewöhnlich nie brauchen.

  • java.applet.Applet ist von java.awt.Panel abgeleitet. Die Klasse java.applet.Applet definiert eine Reihe an Methoden, die im Zusammenhang mit dem Ablauf der Anwendung innerhalb eines Browsers nützlich sind.

Nachdem Sie jetzt die Vererbungslinie von java.applet.Applet kennen, wird im Folgenden ein Blick auf die verschiedenen Methoden in den Klassen geworfen, die speziell für Sie als Programmierer von Java-Applets von Bedeutung sind. Auf die Klassen java.lang.Object und java.awt.Panel wird hierbei nicht eingegangen, weil sie keine Methoden besitzen, die für den Applet-Programmierer wichtig sind.

Interessante Methoden in der Klasse java.awt.Component sind folgende.

  • add() ermöglicht die Verknüpfung eines Popup-Menüs mit einem Applet. Das Popup-Menü wird hierbei jedoch nicht sichtbar. Die entsprechende Routine müssen Sie selber programmieren.

  • remove() löst die Verknüpfung eines Popup-Menüs mit einem Applet.

  • addFocusListener() registriert das Applet insofern, als dass es informiert wird, wenn das Applet den Fokus erhält.

  • removeFocusListener() hebt die Registrierung auf. Ohne Registrierung wird das Applet nicht informiert, wenn es den Fokus erhält.

  • addKeyListener() registriert das Applet insofern, als dass es informiert wird, wenn der Anwender eine Taste drückt. Das Applet muss dabei natürlich den Fokus haben.

  • removeKeyListener() hebt die Registrierung auf, so dass das Applet nicht mehr informiert wird, wenn der Anwender eine Taste drückt.

  • addMouseListener() registriert das Applet insofern, als dass es informiert wird, wenn der Anwender mit der Maus ins Applet klickt.

  • removeMouseListener() hebt die Registrierung auf. Bei Mausklicks wird es nicht mehr informiert.

  • addMouseMotionListener() registriert ein Applet insofern, als dass es informiert wird, wenn die Maus auf dem Applet bewegt wird.

  • removeMouseMotionListener() hebt die Registrierung auf. Das Applet wird nicht mehr informiert, wenn eine Mausbewegung stattfindet.

  • getBackground() gibt die Hintergrundfarbe des Applets als Objekt vom Typ java.awt.Color zurück.

  • setBackground() setzt die Hintergrundfarbe des Applets, indem Sie als Parameter ein Objekt vom Typ java.awt.Color übergeben.

  • getCursor() gibt den momentan eingestellen Cursor für das Applet als Objekt vom Typ java.awt.Cursor zurück.

  • getFont() gibt die momentan verwendete Schrift im Applet zurück.

  • setFont() setzt eine neue Schrift für das Applet.

  • getForeground() gibt die momentane Vordergrundfarbe des Applets als Objekt vom Typ java.awt.Color zurück. Die Vordergrundfarbe ist die Farbe, in der Schrift im Applet gezeichnet wird.

  • setForeground() setzt eine neue Vordergrundfarbe, indem Sie ein Objekt vom Typ java.awt.Color als Parameter übergeben.

  • getLocationOnScreen() gibt ein Objekt vom Typ java.awt.Point zurück, das die Koordinaten der linken oberen Ecke des Applets enthält bezogen auf die Anzeige des Applets am gesamten Bildschirm.

  • getSize() gibt die Größe des Java-Applets als Objekt vom Typ java.awt.Dimension zurück.

  • repaint() rufen Sie auf, wenn Sie möchten, dass die Oberfläche des Java-Applets neu gezeichnet wird. Sie rufen paint() niemals direkt auf, sondern nur repaint().

Die für Sie als Applet-Programmierer interessanten Methoden der Klasse java.awt.Container sind folgende.

  • add() rufen Sie auf, wenn Sie Schaltflächen basierend auf AWT-Klassen dem Applet hinzufügen möchten. Mit dem Aufruf dieser Methode werden die Schaltflächen in der Oberfläche des Applets sichtbar.

  • remove() löscht eine Schaltfläche, die vorher mit add() dem Applet hinzugefügt wurde. Die Schaltfläche verschwindet daraufhin von der Oberfläche des Java-Applets.

  • removeAll() löscht alle Schaltflächen, die vorher mit add() dem Applet hinzugefügt wurden.

  • getComponentAt() gibt die Komponente zurück, die auf der Koordinate liegt, dessen X- und Y-Werte Sie als Parameter an die Methode übergeben. Wenn an der übergegebenen Koordinate keine Komponente liegt, wird null zurückgegeben. Die Methode kann hilfreich sein, wenn Sie wissen müssen, ob eine Schaltfläche bzw. welche Schaltfläche an einer bestimmten Stelle im Applet liegt.

  • getComponentCount() gibt die Anzahl der Komponenten im Applet als Wert vom Typ int zurück.

  • getLayout() gibt den Layout Manager zurück, den das Applet momentan verwendet.

  • paint() wird aufgerufen, wenn sich das Java-Applet neu zu zeichnen hat. Der Methode wird automatisch vom Java-System ein Objekt vom Typ java.awt.Graphics übergeben, das Zugriff auf die Oberfläche des Java-Applets ermöglicht. Wenn Sie dieses Objekt zum Bemalen der Oberfläche des Java-Applets verwenden, denken Sie daran, dass mögliche AWT-Objekte im Vordergrund liegen und eventuell Ihre Zeichnungen verdecken.

  • setCursor() setzt einen neuen Cursor für das Applet, indem Sie als Parameter ein Objekt vom Typ java.awt.Cursor oder eine der statischen Konstanten in dieser Klasse übergeben.

Interessante Methoden in der Klasse java.applet.Applet sind folgende.

  • init() wird automatisch aufgerufen, wenn das Applet geladen wird. Sie packen in diese Methoden für gewöhnlich Initialisierungsanweisungen hinein.

  • start() wird automatisch aufgerufen, wenn das Applet starten soll. Diese Methode wird nach dem Aufruf von init() ausgeführt.

  • stop() wird automatisch aufgerufen, wenn das Applet stoppen soll. Diese Methode wird beispielsweise aufgerufen, wenn der Anwender die Webseite mit dem Java-Applet verläßt.

  • destroy() wird automatisch aufgerufen, wenn das Applet aus dem Speicher gelöscht wird. Diese Methode wird dann ausgeführt, wenn der Anwender den Browser schließt.

  • getAppletContext() rufen Sie auf, wenn Sie Zugriff auf die Umgebung erhalten möchten, in der das Java-Applet läuft. Sie erhalten ein Objekt vom Typ java.applet.AppletContext zurück, auf das im Kapitel später näher eingegangen wird.

  • getAppletInfo() können Sie überschreiben, wenn Sie allgemeine Informationen zum Applet bereitstellen wollen. Diese Informationen können beispielsweise Autor, Datum und Copyright umfassen. Browser können Anwendern Möglichkeiten zur Verfügung stellen, diese Methode aufzurufen und so zusätzliche Informationen zum Applet zu erhalten.

  • getCodeBase() liefert ein Objekt vom Typ java.net.URL zurück, das die genaue Adresse des Java-Applets enthält.

  • getDocumentBase() liefert ein Objekt vom Typ java.net.URL zurück, das die genaue Adresse der Webseite enthält, in der das Java-Applet eingebettet ist.

  • getParameter() ermöglicht den Zugriff auf Parameter. Parameter werden direkt im HTML-Code der Webseite angegeben. Indem Parameter ausgelesen werden, können Applets relativ einfach angepaßt werden. Schließlich muss nicht jedes Mal der Code des Applets geändert und das Applet dann neu kompiliert werden. Man braucht lediglich den Wert des Parameters im HTML-Code ändern und die Webseite neu laden, um Änderungen wirksam werden zu lassen.

  • getParameterInfo() können Sie überschreiben, um allgemeine Informationen zur Verwendung von Parametern, die das Applet unterstützt, dem Anwender zur Verfügung zu stellen. Diese Methode kann wie getAppletInfo() vom Browser aufgerufen werden.

  • showStatus() rufen Sie auf, wenn Sie Text in die Statusleiste schreiben wollen, die viele Browser anbieten.

Nachdem Sie zahlreiche interessante Methoden kennengelernt haben, die Sie ohne Verwendung anderer Klassen direkt in Ihrem Java-Applet aufrufen können, sehen Sie im Folgenden eine kleine Beispiel-Anwendung, die den Einsatz der Methode getParameter() demonstriert.

import java.applet.*; 
import java.awt.*; 

public class MyApplet extends Applet 
{ 
  public void init() 
  { 
    String BgColor = getParameter("BgColor"); 
    if (BgColor.equals("Rot")) 
    { 
      setBackground(Color.red); 
    } 
    else if (BgColor.equals("Grün")) 
    { 
      setBackground(Color.green); 
    } 
    else if (BgColor.equals("Blau")) 
    { 
      setBackground(Color.blue); 
    } 
  } 
} 

Das Java-Applet liest mit getParameter() einen Parameter namens BgColor aus. Der Wert des Parameters wird als java.lang.String zurückgegeben und in einer Variablen BgColor gespeichert. Diese Variable wird daraufhin mit verschiedenen Angaben verglichen, um dann die Hintergrundfarbe des Applets mit setBackground() zu setzen.

Damit obiges Beispiel tatsächlich funktioniert, muss im HTML-Code der Webseite der Parameter, der ausgelesen werden soll, angegeben sein.

<html>
  <head>
    <title>Programmieren in Java: Aufbau</title>
  </head>
  <body>
    <applet code="MyApplet.class" width="500" height="400">
      <param name="BgColor" value="Rot">
    </applet>
  </body>
</html>

Java-Applets werden Parameter mit dem <param>-Tag übergeben. Dieser muss zwischen dem geöffneten und geschlossenen <applet>-Tag stehen. Im <param>-Tag werden zwei Attribute angegeben. Hinter dem Attribut name wird der Name des Parameters angegeben. Genau dieser Wert wird auch als Parameter an die Methode getParameter() im Java-Applet übergeben. Das zweite Attribut im <param>-Tag heißt value. Hinter diesem Attribut wird der Wert angegeben, auf den der Parameter gesetzt wird. Indem dieser Wert geändert und die Webseite neu geladen wird, kann die Hintergrundfarbe des Applets gesetzt werden. Eine Änderung des Java-Codes ist also nicht notwendig. Indem also die wichtigsten Einstellungen als Parameter in der Webseite vorgenommen werden können, kann der Umgang mit dem Java-Applet erheblich vereinfacht werden.

Beachten Sie: Während das Attribut name Gross- und Kleinschreibung nicht unterscheidet, tut dies die Angabe hinter value schon.


7.3 java.applet.AppletContext

Zugriff auf die ausführende Umgebung

Sie haben bereits in der obigen Auflistung der Methoden gesehen, dass die Klasse java.applet.Applet eine Methode namens getAppletContext() bereitstellt. Diese Methode liefert ein Objekt vom Typ java.applet.AppletContext zurück. Dieses Objekt repräsentiert die Umgebung, innerhalb der das Applet abläuft. Das ist für gewöhnlich ein Browser. Indem Sie auf ein Objekt vom Typ java.applet.AppletContext zugreifen, greifen Sie genaugenommen auf den Browser zu und können Methoden aufrufen, die Funktionen des Browsers nutzen.

Nur um Missverständnissen vorzubeugen: java.applet.AppletContext ist eine ganz gewöhnliche Java-Klasse aus der offiziellen Klassenhierarchie. Sie haben daher natürlich nicht direkt Zugriff auf Funktionen des Browsers. Die Klasse java.applet.AppletContext gibt Ihnen die Möglichkeit, einen Teil der Funktionalität des Browsers zu nutzen. Direkter Zugriff auf sämtliche Browser-Funktionen wäre ein viel zu großes Sicherheitsrisiko.

Sehen Sie sich folgendes Beispiel an, in dem die Klasse java.applet.AppletContext Verwendung findet.

import java.applet.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.net.*; 

public class MyApplet extends Applet implements ActionListener 
{ 
  TextField Url; 
  Button Start; 

  public void init() 
  { 
    setLayout(new GridLayout(2, 1)); 
    Url = new TextField("http://www.highscore.de/"); 
    Start = new Button("Browse"); 
    Start.addActionListener(this); 
    add(Url); 
    add(Start); 
  } 

  public void actionPerformed(ActionEvent ev) 
  { 
    AppletContext Context = getAppletContext(); 
    try 
    { 
      Context.showDocument(new URL(Url.getText()), "_blank"); 
    } catch (MalformedURLException ex) { } 
  } 
} 

Das Applet platziert unter Verwendung des Layout Managers java.awt.GridLayout zwei Schaltflächen: Eine Texteingabebox und eine Schaltfläche zum Anklicken. Wenn die Schaltfläche betätigt wird - egal, ob mit der Maus oder per Tastatur - wird das Ereignis von der Methode actionPerformed() abgefangen. Innerhalb dieser Methode wird mit getAppletContext() auf die Umgebung des Applets zugegriffen. Es wird also ein Objekt vom Typ java.applet.AppletContext zurückgegeben. Dieses Objekt bietet eine Methode showDocument() an - nicht sehr verwunderlich, nachdem die Umgebung des Applets ja der Browser ist und dieser für gewöhnlich Webseiten anzeigen kann. Indem nun also die Methode showDocument() für das Objekt vom Typ java.applet.AppletContext aufgerufen wird, wird der Browser angewiesen, eine neue Webseite anzuzeigen. showDocument() werden hierzu zwei Parameter übergeben. Der erste Parameter ist ein Objekt vom Typ java.net.URL, der die Adresse der Webseite enthält, die angezeigt werden soll. Der zweite Parameter ist ein Objekt vom Typ java.lang.String, der angibt, in welchem Fenster die neue Webseite eingeblendet werden soll. Indem als Parameter "_blank" übergeben wird, wird die Webseite in einem neuen Browser-Fenster geöffnet.

Beim Erstellen eines neuen Objekts vom Typ java.net.URL muss eine mögliche Exception vom Typ java.net.MalformedURLException abgefangen werden. Diese Exception tritt auf, wenn als Parameter an den Konstruktor keine gültige URL übergegeben wird. Gültige URLs müssen unter anderem mit dem Kürzel http:// beginnen. Geben Sie dieses also zusätzlich vor einer Web-Adresse an, damit die entsprechende Webseite aufgerufen wird.

Das Interface java.applet.AppletContext bietet folgende Methoden an, über die das Applet die Funktionalität des Browsers nutzen kann.

  • getApplet() ermöglicht es, auf ein anderes Java-Applet zuzugreifen, das in derselben Webseite eingebettet ist. Diesbezüglich gibt es jedoch ein paar Einschränkungen, um die Sicherheit der Java-Applets zu gewährleisten. Die Methode liefert ein Objekt vom Typ java.applet.Applet zurück.

  • showDocument() hatten Sie bereits eben im Beispiel im Einsatz gesehen. Mit dieser Methode können Sie Webseiten laden und in verschiedenen Browser-Fenstern anzeigen. Indem Sie den zweiten Parameter weglassen und dieser Methode nur ein Objekt vom Typ java.net.URL übergeben, wird die aktuelle Webseite mit dem Applet ausgeblendet und an gleicher Stelle die neue Webseite anzeigt.

  • showStatus() rufen Sie auf, um Text in der Status-Leiste des Browsers einzublenden. Sie übergeben der Methode einen Parameter vom Typ java.lang.String, der den Text enthält.

Das Interface bietet zwei weitere Methoden namens getAudioClip() und getImage() an. Diese beiden Methoden sind auch in der Klasse java.applet.Applet definiert. Sie werden beide im Kapitel 3, Grafik und Sound näher vorgestellt.


7.4 applet-Tag in HTML

Integration von Applets in Webseiten optimieren

Der <applet>-Tag zum Einbinden von Java-Applets in Webseiten bietet eine ganze Reihe an Attributen an, die in folgender Auflistung vorgestellt werden. Die Attribute müssen jeweils innerhalb des <applet>-Tags im HTML-Code gesetzt werden.

  • code gibt an, welche Java-Klassendatei geladen werden soll. Die Verwendung von code innerhalb eines <applet>-Tags ist Pflicht - sonst weiß der Browser überhaupt nicht, welches Java-Applet überhaupt abgespielt werden soll. Die Angabe für dieses Attribut enthält den Klassennamen inklusive der Dateieindung class. Ist die Klasse einem Paket zugeordnet, so wird der Paketname zusätzlich angegeben und wie gewohnt durch einen Punkt vom Klassennamen getrennt.

  • width legt fest, wieviel Pixel das Applet in der Webseite an Platz einnehmen darf. Dieses Attribut legt die Breite des Applets fest. Die Angabe besteht lediglich aus einer Zahl. Dieses Attribut muss in <applet>-Tags verwendet werden.

  • height legt fest, wieviel Pixel das Applet in der Webseite an Platz einnehmen darf. Dieses Attribut legt die Höhe des Applets fest. Die Angabe besteht lediglich aus einer Zahl. Dieses Attribut muss in <applet>-Tags verwendet werden.

  • codebase ist ein optionales Attribut. Sie können hierbei festlegen, wo genau die Klassendatei liegt, die hinter code angegeben ist. Dies kann eine relative oder absolute Pfadangabe sein. Absolute Pfadangaben sollten als URL geschrieben werden.

  • alt ist ein optionales Attribut. Sie geben hierbei einen Text an, der vom Browser eingeblendet werden soll, wenn der Browser den <applet>-Tag zwar versteht, ihn jedoch nicht interpretiert und das Applet daher auch nicht ausführt.

  • name ist ein optionales Attribut. Sie legen einen Namen für ein Applet fest, wenn Sie innerhalb von Javascript auf das Applet zugreifen möchten oder Sie mehrere Applets in Ihrer Webseite eingebettet haben, die miteinander kommunizieren sollen. Über dieses Attribut können einzelne Applets identifiziert werden.

  • align ist ein optionales Attribut. Sie definieren hierbei die Ausrichtung des Appplets in Bezug auf andere Elemente in der Webseite. So geben Sie beispielsweise mit der Angabe right an, dass das Applet innerhalb eines umgebenden Textes am rechten Browser-Rand angezeigt wird. Das Attribut align darf folgende Angaben erhalten: left, right, top, texttop, middle, absmiddle, baseline, bottom und absbottom. Schlagen Sie in einer Dokumentation zu HTML nach, welche Ausrichtung die Angaben bewirken.

  • vspace ist ein optionales Attribut. Sie geben hierbei einen Rand an, der links und rechts vom Applet gilt. Text, der um das Applet fließt, muss den angegebenen Abstand zum Applet einhalten. Die Angabe für dieses Attribut besteht lediglich aus einer Zahl, die die Breite des Randes in Pixel darstellt.

  • hspace ist ein optionales Attribut. Sie geben hierbei einen Rand an, der ober- und unterhalb des Applets gilt. Text, der um das Applet fließt, muss den angegebenen Abstand zum Applet einhalten. Die Angabe für dieses Attribut besteht lediglich aus einer Zahl, die die Breite des Randes in Pixel darstellt.

Wie Sie wissen muss der <applet>-Tag immer auch durch einen zweiten Tag abgeschlossen werden. Zwischen beiden Tags können zusätzlich Parameter im HTML-Code angegeben werden, über die Werte an das Applet weitergereicht werden können. Den <param>-Tag haben Sie in diesem Kapitel bereits kennengelernt.

Zwischen dem geöffneten und dem geschlossenen <applet>-Tag kann neben Parametern auch ein Text angegeben werden. Wenn ein Browser den <applet>-Tag nicht kennt, wird dieser komplett ignoriert. Stattdessen wird dann der Text angezeigt, der innerhalb der <applet>-Tags angegeben ist. Damit kann ein Anwender, der einen Browser ohne Java-Unterstützung verwendet, darauf hingewiesen werden, dass er das Java-Add-In installieren muss, um das Java-Applet ausführen zu können.

Ein Beispiel für einen HTML-Code, der sich aller oben vorgestellter Attribute bedient, ist im Folgenden zu sehen.

<html>
  <head>
    <title>Programmieren in Java: Aufbau</title>
  </head>
  <body>
    <applet code="MyApplet.class" 
            width="100" 
            height="50" 
            codebase="http://www.highscore.de/" 
            name="HalloWelt" 
            alt="Applet, das Hallo, Welt! anzeigt" 
            align="right" 
            vspace="10" 
            hspace="5">
      <param name="Text" value="Hallo, Welt!">
      Entweder unterstützt Ihr Browser kein Java oder aber Java ist deaktiviert. 
      Sie können das Java-Applet daher leider nicht sehen. 
    </applet> 
  </body>
</html>

Obiger HTML-Tag bindet ein Java-Applet in die Webseite ein, indem eine Klasse MyApplet geladen wird. Diese Klasse wird aus dem Verzeichnis geladen, das hinter dem Attribut codebase angegeben ist. Das Applet wird in einer Größe von 100 x 50 Pixel in der Webseite angezeigt werden und erhält einen vertikalen Rand von 10 und einen horizontalen Rand von 5 Pixeln. Der Name des Applets lautet HalloWelt. Es wird rechtsbündig ausgerichtet.

Kennt der Browser den <applet>-Tag, interpretiert ihn jedoch nicht, wird die Meldung "Applet, das Hallo, Welt! anzeigt" eingeblendet. Kennt der Browser den <applet>-Tag überhaupt nicht, wird die Meldung eingeblendet, dass der Anwender das Applet leider nicht sehen kann.

Über den <param>-Tag wird dem Applet außerdem ein Parameter namens Text übergeben, der auf den Wert "Hallo, Welt!" gesetzt ist.


7.5 Archive

Klassendateien vereinen und komprimieren

Größere Java-Applets bestehen normalerweise aus mehreren Klassen. Wie Sie wissen muss in Java eine Klasse jeweils in ihrer eigenen Datei definiert werden. Verwenden Sie in Ihrem Projekt also drei selbst definierte Klassen, besteht das fertige Java-Applet ebenfalls aus drei Klassendateien. Damit ein Browser Ihr Java-Applet ausführen kann, benötigt er dementsprechend alle drei Klassendateien. Das Problem hierbei ist, dass Dateien unabhängig voneinander vom Browser über das Internet geladen werden. Es finden bei drei Klassendateien also auch drei Downloads statt. Der Aufbau einer Internet-Verbindung ist jedoch eine sehr zeitfressende Angelegenheit, die einfach mit der Funktionsweise des Internet Protokolls TCP/IP zusammenhängt. Je mehr Klassendateien geladen werden müssen, umso mehr Verbindungen müssen aufgebaut werden. Das kostet Zeit und macht den Ladevorgang von Applets langsam.

Die Lösung sind Archive. Ein Archiv bündelt Klassendateien und packt sie in eine einzige Datei. Anstatt also drei Klassendateien herunterzuladen muss der Browser nur mehr eine einzige Datei downloaden, die die drei Klassendateien enthält. Es muss also auch nur eine einzige Internet-Verbindung für den Download des Java-Applets aufgebaut werden.

Archive haben noch einen zweiten Vorteil: Sie komprimieren die Daten mit speziellen Algorithmen, so dass der Download des Archivs beschleunigt wird. Das Archiv besitzt also eine geringere Dateigröße als alle drei im Archiv gepackten Klassendateien zusammen.

Leider gibt es zwei unterschiedliche Archiv-Typen im Zusammenhang mit Java: Der Microsoft Internet Explorer unterstützt nur CAB-Archive, andere Browser wie der Netscape Navigator nur JAR-Archive. Als Applet-Entwickler gehen Sie normalerweise so vor, dass Sie Ihre Klassendateien also in CAB- und in JAR-Archive packen und somit beiden Browsern den bevorzugten Archiv-Typ bieten. Außerdem sollten Sie die Klassendateien auch ungepackt wie in allen Beispielen bisher dem Browser anbieten, so dass dieser auch dann das Applet laden kann, wenn er überhaupt kein Archiv unterstützt.

Das CAB-Archiv ist eine Erfindung von Microsoft und wird innerhalb von Microsoft Windows bereits länger verwendet, um Dateien zu packen und zu komprimieren. Das JAR-Archiv wurde von Sun speziell für den Einsatz innerhalb Javas erfunden. Obwohl JAR also das offizielle Java-Archiv-Format darstellt, komprimiert CAB Klassendateien für gewöhnlich ein wenig besser als JAR. Letztendlich bleibt Ihnen als Applet-Entwickler sowieso nicht erspart, Archive in beiden Formaten zu erstellen.

Zum Erstellen eines Archivs benötigen Sie ein entsprechendes Programm. Microsoft liefert im Microsoft SDK for Java das Programm cabarc aus, um CAB-Archive zu erstellen. Das SDK von Sun enthält ein Programm namens jar, um JAR-Archive zu erstellen. Voraussetzung zum Erstellen eines Archivs ist immer, dass Sie den Java-Quellcode bereits übersetzt haben und die entsprechenden Klassendateien alle vorliegen.

Sie geben folgenden Befehl ein, wenn Sie ein CAB-Archiv erstellen möchten und Klassendateien in dieses Archiv packen wollen: cabarc n <Archiv> <Klassendateien>

Geben Sie anstelle der Angaben in spitzen Klammern die Dateinamen des Archivs und der Klassendateien an, und zwar jeweils durch Leerzeichen getrennt. Zum Dateinamen gehört auch immer die Endung, also für das Archiv cab und für die Klassendateien class.

Sie müssen folgenden Befehl ausführen, um ein JAR-Archiv zu erstellen und in dieses Archiv Klassendateien zu packen: jar cf <Archiv> <Klassendateien>

Geben Sie anstelle der Angaben in spitzen Klammern die Dateinamen des Archivs und der Klassendateien an, und zwar jeweils durch Leerzeichen getrennt. Zum Dateinamen gehört auch immer die Endung, also für das Archiv jar und für die Klassendateien class.

Sind die Archive erstellt worden, müssen Sie den HTML-Code dahingehend erweitern, dass der Browser beim Laden eines Applets auch darüber informiert wird, dass ein Archiv vorliegt. Ein möglicher HTML-Code, der sowohl das CAB- als auch das JAR-Archiv einbindet, sieht wie folgt aus.

<html>
  <head>
    <title>Programmieren in Java: Aufbau</title>
  </head>
  <body>
    <applet class="MyApplet.class" width="100" height="50" archive="MyApplet.jar">
      <param name="cabbase" value="MyApplet.cab">
    </applet>
  </body>
</html>

Im obigen Beispiel wird im HTML-Code auf ein JAR-Archiv MyApplet.jar und ein CAB-Archiv MyApplet.cab verwiesen. Beachten Sie, wie dies im Einzelnen geschieht. JAR-Archive werden über ein zusätzliches Attribut archive im <applet>-Tag eingebunden. CAB-Archive hingegen werden über einen Parameter im <param>-Tag angegeben, der den Namen cabbase erhalten muss. Während der Microsoft Internet Explorer den Parameter erkennt und die Datei MyApplet.cab lädt, erkennt beispielsweise der Netscape Navigator das Attribut archive und lädt die Datei MyApplet.jar. Ein Browser, der weder JAR noch CAB kennt, lädt hingegen direkt die Datei MyApplet.class und in weiteren Downloads eventuell andere Klassendateien, die zum Java-Applet gehören.

So ärgerlich es ist, zwei verschiedene Archive erstellen zu müssen - im HTML-Code schließt sich die Einbindung der Archive gegenseitig nicht aus, so dass Sie Vorteile in allen Browsern, die einen Archiv-Typ unterstützen, erzielen können.


7.6 Aufgaben

Übung macht den Meister

Sie können die Lösungen zu allen Aufgaben in diesem Buch als ZIP-Datei erwerben.

  1. Entwickeln Sie ein Java-Applet, das beim Überfahren mit der Maus eine Schaltfläche vom Typ java.awt.Button einblendet. Verläßt die Maus das Applet, soll die Schaltfläche sichtbar bleiben. Klickt der Anwender auf die Schaltfläche, soll in einem neuen Browser-Fenster eine Webseite aufgerufen werden, dessen Adresse als Parameter im HTML-Code der Webseite angegeben werden kann. Die Webseite soll auch dann geöffnet werden, wenn das Kürzel http:// nicht in der Web-Adresse im Parameter enthalten ist.

    Am problematischsten ist wahrscheinlich das Einblenden der Schaltfläche beim Drüberfahren mit der Maus. Fügen Sie das entsprechende Objekt mit add() innerhalb von init() ruhig dem Applet hinzu - rufen Sie aber vorher die Methode setVisible() für die Schaltfläche auf. Mit dieser Methode blenden Sie die Schaltfläche dann auch beim Drüberfahren mit der Maus wieder ein. Sie müssen nach dem Aufruf von setVisible() eventuell die Methode validate() aufrufen, um ein Neuzeichnen der Oberfläche des Java-Applets inklusive des AWT-Objekts zu erzwingen.

  2. Entwickeln Sie ein Java-Applet, das bei einem Mausklick ein Popup-Menü anzeigt, und zwar an der Stelle, an der mit der Maus geklickt wurde. Das Popup-Menü soll aus zwei Einträgen namens Microsoft und Netscape bestehen. Bei einem Mausklick auf einen Eintrag soll die Website der jeweiligen Firma in einem neuen Browser-Fenster geöffnet werden.

    Die Entwicklung eines Popup-Menüs können Sie der Dokumentation entnehmen. Sie müssen lediglich Objekte vom Typ java.awt.MenuItem erstellen und diese einem Objekt vom Typ java.awt.PopupMenu hinzufügen. Um ein Popup-Menü einzublenden, steht eine Methode show() zur Verfügung. Um herauszufinden, auf welchen Eintrag im Popup-Menü der Anwender geklickt hat, benötigen Sie zusätzliche Informationen, die dem entsprechenden Event-Handler als Parameter automatisch vom Java-System übergeben werden. Sie können über eine Methode namens getSource() herausfinden, bei welchem Objekt das Ereignis auftrat. Auf diese Weise können Sie den Menüeinträgen jeweils die richtige Website zuweisen.