Applets

Inhalt

 

 

Einführung

 

Initalisierung

 

Parameter

 

Kommunikation mit dem Browser

 

Sicherheit

 

Übungsaufgaben

Einführung

Applets sind im Prinzip Komponenten, die in eine Web-Seite eingelagert werden. Solche Seiten können dann mit einem Java-fähigen Browser betrachtet werden. Die enthaltenen Applets werden dabei gestartet und können auf den ihnen zugewiesenen Platz zeichnen. Da sie Komponenten sind, verhalten Sie sich im Prinzip wie die Fenster, die wir schon kennengelernt haben. Sie lassen sich allerdings nicht in der Größe verändern. Man kann auch von einen Applet aus ein externes Fenster öffnen, das dann unabhängig vom Browser besteht.

Derzeit sind die neuesten Versionen der Browser von Netscape und Microsoft Java-fähig. Für Java 1.2 benötigt man allerdings das Java-Plugin von Sun.

Man kann allerdings Applets auch mit dem Applet-Viewer betrachten. Dieses Programm startet man von der Kommandozeile mit

appletviewer Seite.html

Dabei ist Seite die HTML-Datei, die das Java-Applet enthält.

Beim Applet-Programmieren sind also zweierlei Dinge zu tun

    1. Programmieren und Übersetzen des Java-Codes.
    2. Erstellen der HTML-Datei für das Applet.

Für den Punkt 2 gibt es eine Reihe von Tools. Sehr einfach zu handhaben ist beispielsweise der HTML-Editor AOL-Press für Windows. Die Versionen 4.x der Browser können ebenfalls HTML-Code editieren.

Erstellen der HTML-Seite

Man kann jedoch die Seite jederzeit von Hand mit einem Editor erstellen. Für unsere Zwecke genügt folgende einfache Seite.

<HTML>
<HEAD>
    <TITLE>Mein Applet</TITLE>
</HEAD>
<BODY>

<H1 ALIGN="CENTER">Mein Applet</H1>
<CENTER>
<P>
<APPLET CODE="Appletname.class" WIDTH="348" HEIGHT="322" ALIGN="BOTTOM">
Ihr Browser ist nicht java-f&auml;hig!
</APPLET>

</CENTER>
</BODY>
</HTML>

Anstelle von Appletname, muss der Klassenname des Applets stehen. Speichert man diese Datei auf AppletTest.html, so kann man sie in einen Browser laden, oder mit

appletviewer AppletTest.html

anschauen. Der Appletviewer zeigt nur das erste in der Seite enthaltene Applet.

Alternativ kann man Applets ab der Version 1.1 in Archiven packen, die dann an einem Stück vom Server geladen werden, auch wenn Sie aus mehreren Klassen bestehen.

Erstellen des Applets

Es genügt zunächst ein einfaches Applet, das einen Text ausgibt. Ein Applet ist immer auch eine Component und hat daher eine paint-Methode, die man überschreiben kann.

import java.awt.*;
import java.applet.*; // Muss sein!

public class HelloWorldApplet extends Applet
{   public void paint (Graphics g)
    {   g.drawString("Hallo Welt!",50,50);
    }
}

Man beachte, dass die Klasse public sein muß. Sie muß in eine Datei HelloWorldApplet.java gespeichert werden. Beim Übersetzen entsteht TestApplet.class, was dann auch im CODE-Parameter des Applet-Tags in der HTML-Datei angegeben werden muss. Beachten Sie auch, daß das Paket java.applet importiert werden muss, oder zumindest die Klasse java.applet.Applet.

Der Browser oder der Applet-Viewer erzeugt dann eine Instanz von TestApplet und meldet sie beim Ereignisverwalter an, so daß die Instanz paint-Nachrichten empfängt. Das Applet sieht so aus:

Offenbar hat das Applet den Default-Hintergrund und nicht den Hintergrund der Seite. Man beachte außerdem, dass ein einfaches Reload der Seite nicht ausreicht, um das Applet neu zu laden, wenn es etwa neu kompiliert wurde. Unter Netscape muss man dazu die Shift-Taste festhalten, beim Internet-Explorer die Control-Taste.

Initialisierung

Ein Applet kann natürlich einen Konstruktor haben. Dieser Konstruktor sollte das Applet intern aufbauen. Insbesondere sollte er notwendige Komponenten hinzufügen. Falls diese Komponenten die Ereignisverwaltung vornehmen, so sieht das Applet unter Umständen sehr einfach aus.

Als Beispiel verwenden wir unser Farbspiel.

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

class TestCanvas extends Canvas
{   public void paint (Graphics g)
    {   System.out.println("paint"); 
        Dimension d=getSize(); 
        int w=d.width,h=d.height; 
        int i=0; 
        Color C; 
        while (i<=w-1-i && i<=h-1-i)
        {   // Beschaffe neue Farbe:
            if (2*i<256) C=new Color(2*i,255-2*i,255); 
            else C=new Color(255,0,255); 
            g.setColor(C); // setze Farbe
            g.drawRect(i,i,w-1-2*i,h-1-2*i); 
            i++; 
        }
    }
}

public class Test extends Applet
{   public void init ()
    {   setLayout(new BorderLayout());
        add("Center",new TestCanvas());
    }
}

Hier wird schon die Methode init von Applet benutzt. Diese Methode wird aufgerufen, wenn das Applet fertig geladen ist und dargestellt werden soll. Man könnte den Code auch in den Konstruktor tun, jedoch ist dies hier nicht der rechte Platz, weil zu diesem Zeitpunkt die Grafik des Browsers nicht initialisiert ist. Der HTML-Code, der das Applet aufruft ist hier

<HTML>
<HEAD>
    <TITLE>Mein Applet</TITLE>
</HEAD>
<BODY>

<H1 ALIGN="CENTER">Mein Applet</H1>
<CENTER>
<P>
<APPLET CODE="Test.class" WIDTH="348" HEIGHT="322" ALIGN="BOTTOM">
Ihr Browser ist nicht java-f&auml;hig!
</APPLET>

</CENTER>
</BODY>
</HTML>

Ein Applet hat außerdem folgende Methoden, die jeweils zu einem anderen Zeitpunkt aufgerufen werden.

init()

Wird nur einmal während der Lebenszeit des Applets aufgerufen, wenn der Browser bereit ist, daß Applet darzustellen.

start()

Wird jedesmal aufgerufen, wenn der Browser die Seite mit dem Applet erneut darstellt (auch beim ersten Mal).

stop()

Wird jedesmal aufgerufen, wenn die Seite nicht mehr sichtbar ist. Das Applet sollte Hintergrundoperationen einstellen, um Rechenzeit zu sparen.

destroy()

Wird aufgerufen, wenn der Browser das Applet nicht mehr benötigt, z.B., wenn er beendet wird.

Die anderen Methoden (außer init) sollten nur dann überlagert werden, wenn das Applet einen eigenen Thread startet. Die Methode destroy ist eventuell nützlich um Netzverbindungen freizugeben.

Parameter

Ein Applet kann Parameter erhalten. Diese Parameter werden im Applet-Tag des HTML-Textes übergeben. Als Beispiel ändern wir HelloWorldApplet so ab, dass der dargestellte String je nach HTML-Seite wechselt.

Zunächst wird der HTML-Text folgendermaßen abgeändert.

<applet code=HelloWorldApplet.class width=300 height=120>
<param name="Text" value="Ein anderer Text">
Ihr Browser kann kein Java!
</applet>

Dies definiert einen Parameter "Text" mit Wert "Ein anderer Text". HelloWorldApplet.java muß so aussehen:

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

public class HelloWorldApplet extends Applet
{   String s;
    public void init ()
    {   s=getParameter("Text");
        if (s==null) s="Hallo Welt!";
    }
    public void paint (Graphics g)
    {   g.drawString(s,50,50);
    }
}

getParameter() liefert null, wenn der Parameter nicht exisitiert.

Umgekehrt kann ein Applet den Browser über seine Parameter informieren, indem es getParameterInfo() überschreibt. Diese Methode sollte für jeden Parameter ein Array mit drei Strings zurückgeben, dem Namen des Parameters, seinem Datentyp und einer Erklärung.

Als Beispiel könnten wir folgenden Code in HelloWorldApplet einfügen.

   public String [][] getParameterInfo ()
    {   String[][] ret=
            {   {"Text","String","Darzustellender Text"},
                {"Font","String","Zu benutzender Font"},
                {"FontSize","int","Größe des Fonts"}
            };
        return ret;
    }

Die Parameter Font und FontSize können wir derzeit noch nicht verwerten. Man beachte nebenbei, wie ein doppeltes Array von Strings initialisiert wird.

Wie kann der Benutzer nun die nötigen Parameter erfahren? Dazu öffnet man im Applet-Viewer die Seite "Info". Dort werden alle Parameter angegeben. Der Netscape Communicator zumindest stellt diese Informationen nicht zur Verfügung.

Kommunikation mit dem Browser

Applets können natürlich alle Ereignisse empfangen, die normale Javaprogramme auch empfangen können. Falls ein Applet allerdings Tastaturereignisse für ein Canvas benötigt, muß es jedoch zuerst requestFocus() aufrufen. Dies kann z.B. als Reaktion auf einen Mausklick geschehen. Insbesondere Spiele, die tastaturgesteuert ablaufen, müssen so den Focus beantragen.

Ein Applet kann direkt Ausgaben auf der Statuszeile des Browsers erzeugen. Dies geschieht mit der Methode showstatus, also etwa

   showStatus("Berechenung beendet");

Ein Applet kann auch eine andere Web-Seite laden. Dazu wird zunächst ein Applet-Kontext benötigt. Außerdem wird eine URL (Uniform Ressource Locator) für das Ziel benötigt. Dies kann eine Seite im Netz sein, oder auch eine lokale Seite.

Als Beispiel schreiben wir ein Applet, das die Kurs-Seite öffnet. Sie können das Applet gleich links ausprobieren. Leider müssen wir bei der Erzeugung der URL ein wenig vorgreifen. Insbesondere kann eine Exception auftreten, die man abfangen muss. Beachten Sie weiterhin, dass der Button sich über das ganze Applet erstreckt. Dies wird mit einem BorderLayout erreicht.

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

public class DocumentApplet extends Applet
{   Button b;
    public void init ()
    {   setLayout(new BorderLayout()); // Damit der Knopf groß wird
        add("Center",b=new Button("Zum Kurs"));
    }
    public boolean action (Event e, Object o)
    {   if (e.target==b)
        {   AppletContext ac=getAppletContext();
            try
            {   ac.showDocument(new URL(getCodeBase(),"Kurs.html"));
                    // URL wird spaeter erklaert.
            }
            catch (Exception ex) {}
            return true;
        }
        return false;
    }
}

Applets können auch mit anderen Applets auf derselben Seite kommunizieren. Dazu dienen die Methoden getApplet und getApplets von AppletContext. Letzeres liefert eine Enumeration von allen Applets der Seite.

Sicherheit

Java-Applets unterliegen in einem Browser relativ scharfen Bechränkungen.

Sie dürfen

Es ist heute schon möglich, Applets digital zu signieren. Solche signierten Applets laufen außerhalb der Java-Sandbox. Jedoch haben die beiden wichtigen Browser eigene Signaturmethoden. Mit dem Hotjava-Browser von Sun und den Tools des JDK könnte man ebenfalls signierte Applets erkennen, jedoch hat dieser Browser einen verschwindenden Marktanteil. Außerdem wird erst die nächste Java-Version eine feine Einstellung der Berechtigungen bringen. Übrigens kann auch der Applet-Viewer mit signierten Applets umgehen, und man kann dort die Sandbox für Applets erweitern.

Übungsaufgaben

  1. Erstellen Sie ein Applet, das die aktuelle Zeit angibt. Verwenden Sie dazu die Klasse Date und deren Methode toString().
  2. Schreiben Sie ein Applet, das eine Funktion plottet. Verwenden Sie dazu einfach den Code aus dem SinCanvas. Geben Sie dem Applet einen schwarzen Rahmen und zeichnen Sie die Funktion in grün.
  3. Testen Sie die Behandlung von Tastaturereignissen in Applets. Benutzen Sie dazu die Tastaturbehandlung von Java 1.0.2 (also die Methode keyDown(), die auch von Applet implementiert wird). Testen Sie im Applet-Viewer und im Browser.

Lösungen.

Aufgaben ohne Lösung

  1. Schreiben Sie ein Applet, auf das man zeichnen kann. Verwenden Sie zunächst die Ereignisbehandlung von Java 1.0.2. Dazu müssen Sie mouseDown(), mouseDragged() und mouseUp() überschreiben. Merken Sie sich immer die alten Koordinaten und zeichnen Sie eine Linie zu den neuen Koordinaten.
  2. Schreiben Sie 1. für das neue Event-System von Java 1.1 um.

Zurück zum Java-Kurs