Werte Inhaltsverzeichnis Hypertext-Version Einfache Klassen und Basistypen © APSIS GmbH

6. Ereignissteuerung

Seite 117

6.1. Menüs für Programmsteuerung

Seite 118

6.1.1. Das leere Menü

Seite 118

package lehrbuch.kapitel6; // (6.1)
public class LeerMenue {
	public void menue(); // vier wirkungslose Menüpunkte + Ende ¬
}
public class LeerMitMenue extends java.applet.Applet { // (6.2)
	public void start() {
		lehrbuch.kapitel6.LeerMenue leerMenue = new lehrbuch.kapitel6.LeerMenue();
		leerMenue.menue(); // ¬
		lehrbuch.Programm.meldung("Ende"); // erscheint nach Beendigung des Menüs
	}
}

Übung 6.1: Rufen Sie die Methode menue der Klasse lehrbuch.kapitel6.SpezialMenue in einem Programm auf. Betrachten Sie das Ergebnis. Den Aufruf können Sie mit der Auswahl des Menüpunkts "Ende" verlassen.

Übung 6.2: Die Klasse lehrbuch.kapitel6.EimerMenue ist geeignet, das Füllen und Entleeren von zwei Eimern zu steuern. Benutzen Sie sie zusammen mit der Klasse lehrbuch.Eimer in einem Programm. Hier müssen Sie beim Aufruf der Methode menue (für ein geeignetes Objekt) ihr zwei (von Ihnen vereinbarte) Datenbehälter der Klasse Eimer als Parameter angeben. Durch die Menüauswahl "Fuellen links Wasser" wird der erste Eimer mit Wasser gefüllt, durch die Auswahl "Fuellen rechts Wein" wird der Zweite mit Wein gefüllt. Mit "Entleeren links" und "Entleeren rechts" kann der Erste bzw. der Zweite entleert werden. Der letzte Menüpunkt "Ende" bewirkt das Verlassen des Aufrufs von menue, d.h. anschließend werden die Anweisungen ausgeführt, die Sie nach dem Aufruf menue in Ihrem Programm geschrieben haben. Entleeren Sie zum Schluss beide Eimer. Im Fenster sehen Sie selbstverständlich nur jene Eimer, die Sie vor dem Aufruf von menue mit anzeigen sichtbar gemacht haben.

Das Profil der Methode menue befindet sich in der Spezifikation der Klasse lehrbuch.kapitel6.EimerMenue:

package lehrbuch.kapitel6; // (6.3)
public class EimerMenue {
	public void menue(Eimer links, Eimer rechts); // Menü für zwei Eimer ¬
	// Ein Menü für Füllen und Entleeren wird im Fenster dargestellt.
	// Der Aufruf kann mit der Auswahl von "Ende" verlassen werden.
}

6.1.2. Anonyme Objekte

Seite 119

public class AnonymesObjekt extends java.applet.Applet { // (6.4)
	public void start() {
		new lehrbuch.kapitel6.LeerMenue().menue(); // anonymes Objekt ¬
	}
}

6.1.3. Menügesteuerte Programme

Seite 119

eimer.fuellen(Eimer.WASSER);
Eimer.meldung ("Eimer wurde mit Wasser gefuellt");
import lehrbuch.*; // Eimer, LeerAusn, VollAusn // (6.5)
import lehrbuch.kapitel6.EimerMenue;
public class ZweiEimerMitMenue extends java.applet.Applet {
	public void start() {
		try {
			Eimer eimer1 = new Eimer(), eimer2 = new Eimer();
			Eimer.meldung("Guten Tag!"); // Begrüßung
			eimer1.anzeigen(); // Eimer werden sichtbar gemacht
			eimer2.anzeigen();
			Eimer.meldung("Füllen und leeren Sie Ihre Eimer über das Menü");
			Eimer.meldung("Verlassen Sie das Menü mit vollen Eimern");
			new EimerMenue().menue(eimer1, eimer2); // Eimer interaktiv füllen ¬
			eimer2.entleeren(); // eimer2 wird entleert
			eimer2.fuellen(eimer1.inhalt()); // dann wieder gefüllt
		}
		// Ausnahmen durch Bedienungsfehler werden aufgefangen:
		catch (LeerAusn ausnahme) { Eimer.meldung("Eimer leer", "Bedienungsfehler"); }
		catch (VollAusn ausnahme) { Eimer.meldung("Eimer voll", "Bedienungsfehler"); }
		catch (Exception ausnahme) { Eimer.meldung("Ausnahme", "Programmfehler"); } // ¬
		finally { Eimer.meldung("Auf Wiederrechnen"); } // Verabschiedung
	}
}

6.2. Rückruf

Seite 120

6.2.1. Prozedurparameter

Seite 120

new FMenue().menue(rueckrufprozedur); // nicht in Java
new FMenue().menue("rueckrufprozedur");
import lehrbuch.*; // Eimer, LeerAusn, VollAusn // (6.6)
public class UmfuellenMitProzedurparameter extends java.applet.Applet {
	public void umfuellen(Eimer ziel, Eimer quelle) {
		// Inhalt von quelle wird nach ziel übertragen; anschließend quelle geleert
		try {
			ziel.fuellen(quelle.inhalt());
			quelle.entleeren();
		}
		catch (LeerAusn ausnahme) { Eimer.meldung("Eimer leer", "Bedienungsfehler"); }
		catch (VollAusn ausnahme) { Eimer.meldung("Eimer voll", "Bedienungsfehler"); }
	}
	public void start() {
		Eimer links = new Eimer(), rechts = new Eimer();
		... // evtl. Eimer anzeigen
		Eimer.meldung("Menüpunkt 'Frei' = Umfüllen");
		new lehrbuch.kapitel6.FMenue().menue(links, rechts, "umfuellen"); // ¬
		... // evtl. mit den Eimern weiterarbeiten
	}
}

Abb. 6.1: Rückrufprozeduren

6.2.2. Überschreiben leerer Methoden

Seite 122

package lehrbuch.kapitel6;
import lehrbuch.Eimer;
public class FreiMenue {
	protected void frei(Eimer e1, Eimer e2); // zum Überschreiben ¬
	public void menue(Eimer links, Eimer rechts); // zum Aufrufen ¬
}
import lehrbuch.*; // Eimer, LeerAusn, VollAusn // (6.7)
class UmfuellenMenue extends lehrbuch.kapitel6.FreiMenue { // nicht public
	protected void frei(Eimer ziel, Eimer quelle) {
		// die formalen Parameter e1 und e2 heißen jetzt ziel und quelle ¬
	 // (die Namen der formalen Parameter gehören nicht zum Profil, nur ihre Typen)
		... // wie im Programm (6.6)
}
public class UmfuellenMitMenue extends java.applet.Applet {
	public void start() {
		Eimer links = new Eimer(), rechts = new Eimer();
		... // evtl. Eimer anzeigen
		Eimer.meldung("Menüpunkt 'Frei' = Umfüllen");
		new UmfuellenMenue().menue(links, rechts); // ¬
		... // evtl. mit den Eimern weiterarbeiten
	}
}

Abb. 6.2: Rückruf durch Überschreiben

6.2.3. Mehrere Menüversionen

Seite 123

import lehrbuch.*; // Eimer, LeerAusn, VollAusn // (6.8)
class ErsetzenMenue extends lehrbuch.kapitel6.FreiMenue {
	protected void frei(Eimer ziel, Eimer quelle) { // ¬
		// ziel wird zuerst geleert, dann mit dem Inhalt von quelle gefüllt
		try {
			ziel.entleeren();
			ziel.fuellen(quelle.inhalt());
		}
		catch ... // Ausnahmen LeerAusn und VollAusn auffangen
	}
}
public class UmfuellenUndErsetzen extends java.applet.Applet {
	public void start() {
		Eimer links = new Eimer(), rechts = new Eimer();
		... // evtl. Eimer anzeigen
		Eimer.meldung("Menüpunkt 'Frei' = Umfüllen");
		new UmfuellenMenue().menue(links, rechts); // aus dem Programm (6.7) ¬
		Eimer.meldung("Menüpunkt 'Frei' = Ersetzen");
		new ErsetzenMenue().menue(links, rechts); // ¬
	}
}

Übung 6.3: Tippen Sie zuerst das Programm (6.8) aus Seite 123 mit Ihren eigenen Bezeichnern ein. Versuchen Sie dabei, seine Arbeitsweise zu verstehen. Testen Sie es. Entwickeln Sie anschließend Ihr eigenes Programm auf folgende Weise; Sie werden dabei verstehen, wie an ein Menüpunkt verschiedene Prozeduren mit Hilfe von Parameterprozeduren angehängt werden:

Erzeugen Sie zwei Eimer, die Sie zu Anfang durch anzeigen sichtbar machen. Definieren Sie anschließend zwei verschiedene Rückrufprozeduren (mit je zwei Eimer-Parametern): Sie sollen den ersten Parameter-Eimer mit wasser bzw. wein füllen und den Zweiten unverändert lassen. Die Rückrufprozeduren sollen Sie in zwei Aufrufen der Methode menue aus den zwei Unterklassen von FreiMenue durch Menüauswahl nacheinander aktiviert werden können. Informieren Sie den Anwender zuvor über die jeweilige Auswirkung des Menüpunktes "Frei" in einem Meldungsfenster vor dem Menüaufruf.

Führen Sie Ihre Rückrufprozeduren mit der Auswahl des Menüpunkts "Frei" aus. Die einzelnen menue-Aufrufe können Sie mit der Auswahl des Menüpunkts "Ende" verlassen. Vergleichen Sie das sichtbare Ergebnis (die Wirkung der Menüauswahl "Frei") der verschiedenen Rückrufprozeduren.

Bemerkung: Die Ausnahmen VollAusn und LeerAusn werden in der Klasse FreiMenue aufgefangen: Sie weist die Fehlbedienung über ein Meldungsfenster zurück. Anschließend kann eine neue Auswahl erfolgen. Ähnlich müssen Sie sie in Ihren Rückrufprozeduren auffangen, da die Methode menue keine Ausnahmen exportiert.

6.2.4. Geschachtelte Klassen

Seite 124

import lehrbuch.*; // Eimer, LeerAusn, VollAusn // (6.9)
public class GeschachtelteKlasse extends java.applet.Applet {
	class ErsetzenMenue extends lehrbuch.kapitel6.FreiMenue { // geschachtelt ¬
		... // wie im Programm (6.8)
	}
	public void start() { ... // wie im Programm (6.8)
		new ErsetzenMenue().menue(links, rechts); // ¬
	}
}

6.2.5. Anonyme Klassen

Seite 125

import lehrbuch.*; // Eimer, LeerAusn, VollAusn // (6.10)
public class AnonymeKlasse extends java.applet.Applet {
	public void start() { ... // wie im Programm (6.8)
		new lehrbuch.kapitel6.FreiMenue() { // anonyme Klasse erweitert FreiMenue ¬
			... // Klassenvereinbarung wie im Programm (6.8)
		}.menue(links, rechts); // Aufruf der Methode menue der anonymen Klasse ¬
	}
}
Oberklasse referenz = new Oberklasse() { ... };

6.2.6. Mehrere Menüpunkte

Seite 125

public class ZweiMeldungenMitMenue extends java.applet.Applet { // (6.11)
	class ZweiMeldungenMenue extends lehrbuch.kapitel6.Menue2 { // innere Klasse
		protected void ersterPunkt() {
			lehrbuch.Programm.meldung("Erster Menüpunkt");
		}
		protected void zweiterPunkt() {
			lehrbuch.Programm.meldung("Zweiter Menüpunkt");
		}
	}
	public void start() {
		new ZweiMeldungenMenue().menue(); // ¬
	}
}
package lehrbuch.kapitel6; // (6.12)
public class Menue2 {
	protected void ersterPunkt(); // zum Überschreiben
	protected void zweiterPunkt(); // zum Überschreiben
	public void menue(); // zum Aufrufen
}

6.2.7. Aufgeschobene Methoden

Seite 126

public class ZweiLeereMenuepunkte extends java.applet.Applet { // (6.13)
	public void start() {
		new lehrbuch.kapitel6.Menue2().menue(); // geschieht nichts, außer bei "Ende" ¬
	}
}
package lehrbuch.kapitel6; // (6.14)
public abstract class MenueAufg extends java.applet.Applet { // ¬
	abstract protected void ersterPunkt(); // aufgeschobene Methode ¬
	public void menue(); // zum Aufrufen
	public void start(); // zum Überschreiben; ruft menue auf
}
import lehrbuch.Programm; // (6.15)
public class EinMenuePunkt extends lehrbuch.kapitel6.MenueAufg {
	protected void ersterPunkt() { // ¬
		Programm.meldung("Einziger Menüpunkt");
	}
	public void start() {
		Programm.meldung("Guten Tag!");
		menue(); // ¬
		Programm.meldung("Auf Wiederrechnen!");
	}
}

Übung 6.4: Lösen Sie die Übung 6.3 auf Seite 124 mit Hilfe der aufgeschobenen Klasse lehrbuch.kapitel6.FreiMenueAufg. Ihre Spezifikation ist – wie immer – in der Datei FreiMenueAufg.spec; hier kann man erkennen, dass sie java.applet.Applet erweitert. Zeigen Sie den Unterschied zwischen den Klassen lehrbuch.kapitel6.FreiMenue und lehrbuch.kapitel6.FreiMenueAufg; beweisen Sie, dass die zweite eine aufgeschobene Klasse ist und die erste nicht.

6.2.8. Mehrere aufgeschobene Methoden

Seite 127

import lehrbuch.*; // Eimer, VollAusn, LeerAusn // (6.16)
public class ZweiEimerMitMenue4Aufg extends lehrbuch.kapitel6.Menue4Aufg {
	Eimer links = new Eimer(), rechts = new Eimer(); // zwei Objekte
		// Überschreiben der vier Rückrufprozeduren:
	protected void ersterPunkt() { // ¬
		try {
			links.fuellen(Eimer.WASSER);
		} catch (VollAusn ausnahme) { Eimer.meldung("Eimer voll", "Bedienungsfehler"); }
	}
	protected void zweiterPunkt() { ... // ähnlich für rechts mit wein
	protected void dritterPunkt() { // ¬
		try {
			links.entleeren();
		} catch (LeerAusn ausnahme) { Eimer.meldung("Eimer leer", "Bedienungsfehler"); }
	}
	protected void vierterPunkt() { ... // ähnlich für rechts
	public void start() { ... // evtl. Eimer anzeigen
		menue(); // Aufruf der Menüprozedur, mit Rückruf der vier Prozeduren ¬
		... // evtl. mit dem vom Anwender hinterlassenen Zustand weiterarbeiten
	}
}

6.3. Werkzeuge für Anwenderkommunikation

Seite 128

6.3.1. Menügeneratoren

Seite 128

abstract public class MenueAufg { // (6.17)
	abstract public void menuepunkt1(); /* der Methodenname wird dem Menügenerator
		eingegeben; die Anzahl der aufgeschobenen Rückrufprozeduren hängt von der
		Anzahl der Menüeinträge ab und wird dem Menügenerator angegeben */
	public void menue(); // zum Aufrufen
	public void start(); // zum Überschreiben; ruft menue auf
}

Übung 6.5: Entwickeln Sie ein menügesteuertes Programm für das Anzeigen von Gedichtzeilen oder Sprüchen. Generieren Sie dafür von Menuegenerator ein Menü mit vier Menüpunkten (außer "Ende"). Erweitern Sie die generierte Klasse durch Ihre eigene. Verbinden Sie dabei die einzelnen Menüpunkte mit Rückrufprozeduren; jede soll nacheinander zweimal die Methode meldung mit jeweils einer Textzeile (zwei Zeilen Ihres Lieblingsgedichts oder zwei Sprüche) aufrufen. Insgesamt programmieren Sie also acht Meldungsfenster, zwei pro Menüpunkt.

6.3.2. Direktmenüs

Seite 129

import lehrbuch.kapitel6.DirektMenue; // (6.18)
public class DirektmenueDemo extends java.applet.Applet {
	... // globale Objekte für die Rückrufprozeduren
	protected void ersterPunkt() { ... // ¬
		... // alle Rückrufprozeduren
	public void start() { ... // Vorbereitungsmaßnahmen
		final String[] s = {"Erster Menüpunkt", "ersterPunkt",
			"Zweiter Menüpunkt", "zweiterPunkt", ... // usw.
			// paarweise Menütext und Rückrufprozedur als Strings in Klammen { }
		};
		DirektMenue.menue(s, this); // static-Methode der Klasse DirektMenue ¬
			// Aufruf des Direktmenüs, Rückruf der Prozeduren durch Menü
		... // evtl. mit dem vom Anwender hinterlassenen Zustand weiterarbeiten
		final String[] t = {"Neuer Menüpunkt", "neuerPunkt",
			"Weiterer Menüpunkt", "weitererPunkt", ... // usw., beliebige Anzahl
		};
		DirektMenue.menue(t, this); // erneuter Aufruf des Direktmenüs ¬
			// Rückruf anderer Prozeduren durch andere Menüpunkte
	}
}

Übung 6.6: Lösen Sie die Übung 6.3 auf Seite 124 mit Hilfe des Direktmenüs. Programmieren Sie die Rückrufprozeduren selber, die im FreiMenue schon enthalten waren (die ersten vier Menüpunkte). Fügen Sie dem zweiten Aufruf einen dritten Menüpunkt hinzu, der beide Eimer entleert.

6.3.3. Auswahllisten

Seite 130

public void getraenkWahl();
	// Eimer wird mit dem ausgewählten Getränk gefüllt (auch wenn er zuvor gefüllt war)
import lehrbuch.*; // Eimer // (6.19)
public class EimerMitAuswahlliste extends java.applet.Applet {
	public void start() {
		Eimer e = new Eimer();
		e.getraenkWahl(); // hier wird die Auswahlliste aufgerufen ¬
		e.anzeigen(); // das Ergebnis der Auswahl wird angezeigt
	}
}

Übung 6.7: Programmieren Sie mit Hilfe der von der Klasse Kreis exportierten Methode

public void farbWahl(); // Kreis wird mit der ausgewählten Farbe gefärbt

ein menügesteuertes Programm mit einem sichtbaren und einem unsichtbaren Kreis. Dieser letztere soll als Speicher dienen. Die Operationen bemalen, verstecken und wiederherstellen aus dem Paket Kreis sollen für den sichtbaren Kreis durch Menüauswahl aufgerufen werden können. Generieren Sie mit Hilfe von Menuegenerator ein Menü, diesmal mit englischen Bezeichnungen (die angehängten Prozeduren sollten Sie trotzdem mit deutschen Namen versehen): "Draw" (Zeichnen), "Paint" (Bemalen), "Hide" (Verstecken) und "Redraw" (Wiederherstellen). Bei der Auswahl von "Paint" soll die gewünschte Farbe über die (von farbWahl angebotene) Auswahlliste vom Anwender eingegeben werden. Darüber hinaus sollen die Menüpunkte "Save" (Speichern) und "Load" (Laden) die Farbe des ersten Kreises in den Zweiten speichern bzw. zurückladen.

6.3.4. Eingabemasken

Seite 131

public void getraenkEingabe();
/* Eimer wird mit dem eingetippten Getränk gefüllt (auch wenn er zuvor gefüllt war)
	wenn nicht "Wasser" oder "Wein" eingetippt wird, wird getraenkWahl aufgerufen */
import lehrbuch.*; // (6.20)
public class EimerMitEingabefenster extends java.applet.Applet {
	public void start() {
		Eimer e = new Eimer();
		e.getraenkEingabe(); // ein Wert für Getränke muss eingetippt werden ¬
		e.anzeigen(); // das Ergebnis wird angezeigt
	}
}

6.4. Objektwahl

Seite 132

6.4.1. Aktion nach Vorwahl

Seite 132

6.4.2. Referenzen als Gedächtnis

Seite 132

Abb. 6.3: Referenz als Gedächtnis

import lehrbuch.*; // (6.21)
public class AktionNachVorwahl extends kapitel6.MenueVorwahlAufg { // mit 4 Punkten
	private final Eimer linkerEimer = new Eimer(), rechterEimer = new Eimer();
	private Eimer vorgewaehlterEimer = linkerEimer; // Referenz, vorbesetzt ¬
	protected void linksWaehlen() { // linker Eimer wird vorgewählt
			vorgewaehlterEimer = linkerEimer; // ¬
		}
	protected void rechtsWaehlen() { // rechter Eimer wird vorgewählt
			vorgewaehlterEimer = rechterEimer;
		}
	protected void fuellen() { // Aktion für den vorgewählten Eimer
		try {
			vorgewaehlterEimer.fuellen(); // ¬
		} catch ...
	}
	protected void entleeren() {
		try {
			vorgewaehlterEimer.entleeren();
		} catch ...
	}
	public void start() { ... // evtl. die zwei Eimer anzeigen, und dann:
		menue(); // Aktion nach Vorwahl
}

Übung 6.8: Schreiben Sie ein Programm für drei Kreise nach der Strategie "Aktion nach Vorwahl": Rufen Sie menügesteuert die von Kreis exportierten Operationen bemalen, verstecken und wiederherstellen für den Kreis auf, der vorgewählt wurde. Die Farbe für bemalen lassen Sie über eine Auswahlliste angeben.

6.4.3. Polymorphe Objektwahl

Seite 133

Abb. 6.4: Polymorphe Klassen

try {
	eimer.fuellen(Eimer.WEIN);
}
catch (VollAusn ausnahme) {
	try { // ¬
		eimer.entleeren();
		eimer.fuellen(Eimer.WEIN);
	}
	catch (VollAusn a) {}
	catch (LeerAusn a) {}
}

Abb. 6.5: Polymorphe Objektwahl

import lehrbuch.*; // (6.22)
interface KreisOderEimer { // ¬
	void rot();
	void blau();
	void weiss();
}
class EimerObjekt implements KreisOderEimer { // ¬
	private Eimer eimer;
	EimerObjekt() {
		eimer = new Eimer();
		eimer.anzeigen();
	}
	public void rot() { // ¬
		try { eimer.fuellen(Eimer.WEIN); }
		catch (VollAusn a) {
			try {
				eimer.entleeren();
				eimer.fuellen(Eimer.WEIN);
			}
			catch (VollAusn ausnahme) { System.err.println(ausnahme); } // unerwartet
			catch (LeerAusn ausnahme) { System.err.println(ausnahme); }
		}
	}
	public void blau() { ... // ähnlich mit Eimer.WASSER
	public void weiss() { ... // ähnlich mit entleeren()
}
class KreisObjekt implements KreisOderEimer { // ¬
	private Kreis kreis;
	KreisObjekt() {
		kreis = new Kreis(); // zwei Attrappen (Dummys)
		kreis.zeichnen();
		kreis.verstecken();
			... // zweiter Kreis ähnlich
		kreis = new Kreis(); // dritter (eigentlicher) Kreis erscheint rechts oben
		kreis.zeichnen();
	}
	public void rot() { // ¬
		kreis.bemalen(Kreis.ROT);
	}
	public void blau() { ... ähnlich mit Kreis.BLAU
	public void weiss() { ... ähnlich mit verstecken und zeichnen
}
abstract class MenuePolymorph extends java.applet.Applet { // generiert
	public void start() { menue(); }
	protected void menue() { ... } // Rückrufprozeduren werden aufgerufen
	abstract protected void eimerWaehlen();
	abstract protected void kreisWaehlen();
	abstract protected void rot();
	abstract protected void blau();
	abstract protected void weiss();
}
public class PolymorpheVorwahl extends MenuePolymorph {
		// enthält Applet; start ruft menue auf
	private final KreisObjekt kreis = new KreisObjekt();
	private final EimerObjekt eimer = new EimerObjekt();
	private KreisOderEimer gewaehltesObjekt = eimer; // Vorbesetzungswert
	protected void eimerWaehlen() { gewaehltesObjekt = eimer; }
	protected void kreisWaehlen() { gewaehltesObjekt = kreis; }
	protected void rot() { gewaehltesObjekt.rot(); } // ¬
	... // blau() und weiss() ähnlich
}

6.5. Ereignissteuerung durch Standardklassen

Seite 137

Standardpakete

6.5.1. Standardklassen für Anwenderkommunikation

Seite 137

public class EinKnopf extends java.applet.Applet { // (6.23)
	public void init() {
		java.awt.Button knopf = new java.awt.Button("OK"); // Text auf dem Knopf ¬
		super.add(knopf); // Applet ist Unterklasse von Window, von wo add geerbt wurde
	}
}

6.5.2. Lauscher

Seite 137

class Lauscher implements java.awt.event.ActionListener ...
public void actionPerformed(java.awt.event.ActionEvent ereignis);
public void actionPerformed(java.awt.event.ActionEvent ereignis) {
	... // Reaktion auf das Ereignis
}
Lauscher lauscher = new Lauscher();
Button knopf = new Button();
knopf.addActionListener(lauscher); // ¬
knopf.addActionListener(
	new ActionListener() { // ¬
		public void actionPerformed(ActionEvent ereignis) { ... } // ¬
	});
import java.awt.Button; // (6.24)
import java.awt.event.*; // ActionListener, ActionEvent
public class KnopfDruecken extends java.applet.Applet {
	public void init() {
		Button knopf = new Button("Bitte drücken");
		knopf.addActionListener(
			new ActionListener() {
				public void actionPerformed(ActionEvent ereignis) {
					getGraphics().drawString("Knopf gedrückt", 20, 20); // ¬
					java.awt.Toolkit.getDefaultToolkit().beep(); // ¬
				}
			}
		);
		add(knopf);
	}
}

6.5.3. Verteilung der Ereignisse

Seite 139

import java.awt.Button; // (6.25)
import java.awt.event.*; // ActionListener, ActionEvent
public class ZweiKnoepfe extends java.applet.Applet {
	class HalloLauscher implements ActionListener {
		public void actionPerformed(ActionEvent ereignis) {
			getGraphics().drawString("Hallo", 20, 20);
			play(getCodeBase(), "hallo.au");
		}
	}
	class TschuesLauscher implements ActionListener {
		public void actionPerformed(ActionEvent ereignis) {
			getGraphics().drawString("Tschüs", 20, 50);
		}
	}
	public void init() {
		Button ersterKnopf = new Button("Hallo");
		Button zweiterKnopf = new Button("Tschüs");
		ersterKnopf.addActionListener(new HalloLauscher()); // Registrierung ¬
		zweiterKnopf.addActionListener(new TschuesLauscher()); // ¬
		add(ersterKnopf);
		add(zweiterKnopf);
	}
}

6.5.4. Standardmenüs

Seite 139

import java.awt.*; // Frame, MenuBar, Menu, MenuItem // (6.26)
public class MenueFenster extends Frame {
	public MenueFenster() {
		// Menüleiste aufbauen:
		MenuBar menueLeiste = new java.awt.MenuBar(); // ¬
	super.setMenuBar(menueLeiste); // Menüleiste in das Fenster (Frame) einfügen
		// Menüspalten in die Menüleiste einbauen:
		Menu menue1, menue2; // zwei Einträge in der Menüleiste ¬
		menue1 = new Menu("Erste Menüspalte");
		menueLeiste.add(menue1);
		menue2 = new Menu("Zweite Menüspalte");
		menueLeiste.add(menue2);
		// Menüpunkte in die Menüspalten einbauen:
		MenuItem menuePunkt11, menuePunkt12, menuePunkt2; // drei Menüpunkte ¬
		menuePunkt11 = new MenuItem("Menüpunkt 1.1");
		menue1.add(menuePunkt11);
		menuePunkt12 = new MenuItem("Menüpunkt 1.2");
		menue1.add(menuePunkt12);
		menuePunkt2 = new MenuItem("Menüpunkt 2");
		menue2.add(menuePunkt2);
	}
}
public class MenueFensterAnw {
	public static void main(String[] args) {
	MenueFenster fenster = new MenueFenster();
	fenster.setTitle("Menü im Fenster");
	fenster.setSize(450, 200);
	fenster.setVisible(true);
	}
}

6.5.5. Menüsteuerung

Seite 141

menuePunkt11.addActionListener(lauscher11);
public void actionPerformed(java.awt.event.ActionEvent ereignis) {
	getGraphics().drawString(ereignis.getActionCommand(), 20, 20); // ¬
}
class FensterLauscher extends java.awt.event.WindowAdapter {
	public void windowClosing(java.awt.event.WindowEvent ereignis) { // ¬
		System.exit(0);
	}
}
addWindowListener(new java.awt.event.WindowAdapter() {
	public void windowClosing(java.awt.event.WindowEvent ereignis) { // ¬
		System.exit(0);
	}
});
public class Fenster extends java.awt.Frame implements java.awt.event.ActionListener {
	...
	steuerobjekt.addActionListener(this);
	...
public class MenueMitReaktion extends java.awt.Frame // (6.27)
		implements java.awt.event.ActionListener {
	public MenueMitReaktion () {
		... // Menue aufbauen wie im Programm (6.26)
		// alle Menüpunkte beim Lauscher registrieren lassen
		menuePunkt11.addActionListener(this); // aktuelles Fensterobjekt = Lauscher
		menuePunkt12.addActionListener(this);
		menuePunkt2.addActionListener(this);
		// auf "Schließen" reagieren:
		addWindowListener(new java.awt.event.WindowAdapter() { // anonyme Klasse ¬
			public void windowClosing(java.awt.event.WindowEvent ereignis) {
					System.exit(0);
			}
		});
	}
	// Methode von ActionListener implementieren:
	public void actionPerformed(java.awt.event.ActionEvent ereignis) {
		add(new java.awt.Label(ereignis.getActionCommand())); // ¬
	}
	public static void main(String[] args) { ... // wie oben im Programm (6.26)

6.5.6. Verteilung der Menüereignisse

Seite 142

public class VerteilteEreignisse extends java.awt.Frame { // (6.28)
	public VerteilteEreignisse() {
		... // Menue aufbauen wie im Programm (6.26)
		this.setLayout(new FlowLayout()); // Platzierung der Knöpfe, s. Kapitel 13.1.2.
		Button Knopfs = new Button("Auswahl 1.1");
		knopf11.setSize(100, 100);
		add(knopf11);
		... // weitere Knöpfe und Fensterobjekte
		ActionListener lauscher11 = new ActionListener() { // anonyme Klasse
			public void actionPerformed(ActionEvent ereignis) {
				... // Antwort auf die Menüauswahl
			}
		};
		menuePunkt11.addActionListener(lauscher11); // Menüpunkt registrieren lassen
		knopf11.addActionListener(lauscher11); // Knopf für denselben Lauscher
		... // weitere Menüpunkte und Fensterobjekte bei Lauschern registrieren lassen
		... // weiter wie im Programm (6.26)

Werte Inhaltsverzeichnis Hypertext-Version Einfache Klassen und Basistypen © APSIS GmbH