APPLETS II Vorbereitung
Martin Kellermann / Dave Gööck
Im Tutorium Applets 1 haben wir die grundlegenden
Methoden der Applet-Programmierung kennen gelernt.
Da wir nicht unbedingt Fans der Sesamstrasse sind
lassen wir den Miss Piggy Kram mal weg. Ganz nüchtern bestimmen wir nun, dass es
in diesem jenem welchen Tutorium, in dem wir uns gerade befinden um das
Hinzufügen einer gewissen Funktionalität zum bisher doch recht einfältig
ausschauenden Applets geht.
Zuerst einmal brauchen wir grafische Komponenten,
mit denen wir eine Interaktion zwischen Benutzer und Applet-Klasse realisieren
können. Beispielsweise gibt es Buttons, RadioButtons, Checkboxen, Menüleisten,
Popup-Menüs, TextFields, Labels ....
In unseren Beispielen werden wir die
Swing-Komponenten, anstatt der in der Vorlesung eingeführten AWT-Komponenten
verwenden. Die Swing Komponten haben den Vorteil, dass mit ihnen ein einheitliches Look-And-Feel
(Erscheinungsbild) unter verschiedenen Plattformen verwirklicht werden kann.
Sie sind eine Weiterentwicklung der AWT-Klassen und haben sich inzwischen als
Quasi-Standard etabliert.
Um
die Swing-Komponenten nutzen zu können, muss zuerst folgendes package
importiert werden:
import
javax.swing.*;
Danach
kann man innerhalb der eigenen Klasse wie üblich Instanzen von Swing-Objekten erzeugen.
JButton btn1 = new
JButton("Knopf"); //Erzeugt
einen Knopf mit der Aufschrift „Knopf“
JLabel lb1 = new JLabel(); //Erzeugt eine
Textanzeige ohne Aufschrift
Diese
Objekte sollte man global instanzieren, damit sie in jeder Methode des Applets
verwendet werden können.
Wenn man sich mal die Objekthirarchie ansieht,
stellt man fest, dass ein Applet u.a. von einer Klasse Panel abgeleitet wird.
Ein Panel ist ein Objekt, auf das andere Komponenten, wie Buttons, Labels,
TextAreas und auch wieder Panels platziert werden können. Wenn man also möchte,
dass seine Komponenten auch angezeigt werden, muss man sich die Mühe machen,
sie auf dem Applet anzuordnen. Diese Anordnungen werden mit sog.
Layout-Managern erstellt. Es gibt einige verschiedene Layout-Manager, die alle
verschiedene Eigenschaften haben. Es variiert zwischen einfach und wenig
funktional und schwierig und sehr funktional. Durch geschickte Programmierung
ist es auch möglich die Layouts ineinander zu verschachteln.
Grundsätzlich wird der Layout-Manager durch
Panelname.setLayout(new LayoutmanagerName());
gesetzt.
dazu
muss in den Importanweisungen das Package java.awt importiert werden:
import
java.awt.* ;
Im
Beispiel eines Applets kann das Layout wie folgt in der init-Methode gesetzt
werden:
this.setLayout(new
BorderLayout());
Andere
mögliche Layouts sind z.B.:
FlowLayout – dies ist das Standardlayout. D.h. wenn
nichts anderes angegeben wird, werden alle Objekte hintereinander in einer
Reihe angeordnet.
BorderLayout
– Unterteilt das Panel in 5 Gebiete:
SOUTH, EAST, NORTH, WEST und CENTER.
GridLayout – Unterteilt das Panel in einige gleich
große Zellen, die in einem Raster angeordnet sind.
GridBagLayout
– Für Profis... recht kompliziert in der
Konfiguration, lässt jedoch viel Spielraum.
CardLayout – Ordnet alle Elemente übereinander an,
so dass nur das oberste zu sehen ist.
Nun
müssen also unsere Komponenten hinzugefügt werden. Beim BorderLayout in unserem
Applet könnte das folgendermaßen aussehen (i.d.R. wird das auch in der
init-Methode gemacht):
this.add(btn1,
BorderLayout.SOUTH);
this.add(lb1,
BorderLayout.CENTER);
Wenn man jetzt das Applet kompiliert und startet
(z.b. im Browser über eine Website s. Tutorium Applets1 oder bei Forte eben wie
üblich), wird man sehen, dass die Objekte bereits zu sehen sind. Wenn der Knopf
jedoch betätigt wird, geschieht noch nichts. – Wie schade...
Nun wollen wir dem Knopf aber noch ein bisschen
Leben einhauchen:
Um irgendwelche Aktionen zu registrieren (z.B. das
Drücken eines Buttons oder das Bewegen der Maus über ein bestimmtes Objekt)
werden sogenannte Listener benötigt. Für die Buttons z.B. ein ActionListener
oder für die Maus ein MouseListener... Der Listener ist ein Interface und muss
demnach noch implementiert werden. Wir können dies in unserem einfachen
Beispiel direkt in der Applet-Klasse verwirklichen. Dazu müssen wir die Zeile
der Klassendefinition:
public
class AppletName extends Applet {
zu
der folgenden erweitern
public
class AppletName extends Applet implements ActionListener{
und in der Klasse die Methode
public
void actionPerformed(ActionEvent event) {
}
einfügen.
Diese Methode wird immer dann aufgerufen, wenn eine,
an den Listener gebundene Komponente, ein Event auslöst (z.B. ein Knopf
gedrückt wird). Dazu müssen wir natürlich unsere Objekte in der init-Methode an
den Listener binden, mittels der addActionListener-Methode.
btn1.addActionListener(this);
Zum Schluss muss nur noch angegeben werden, was der
Button auslösen soll. In der actionPerformed-Methode muss dazu die auslösende
Komponente identifiziert werden. Das macht man über einen if-clause:
if(event.getActionCommand().equals(btn1.getActionCommand()))
lb1.setText(“Hallo”);
Einen
zweiten Knopf könnte man nun im else-Zweig identifizieren.
Wenn
wir jetzt das Applet starten, und den Button drücken, dann passiert....
....das
wird doch nicht verraten!!!