![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Nach dem Verständnis der statischen Komponenten einer Benutzeroberfläche sollte der Leser beliebig komplexe GUIs erstellen können. Diese sind jedoch solange unvollständig, wie Interaktionsmöglichkeiten mit der Maus oder mit der Tastatur nicht integriert werden können. Hierzu zählen bspw. die Betätigung von Buttons, Texteingaben oder auch sonstige Verwendungen von Maus oder Tastatur. Aktionen, die ausgelöst werden, wenn statische Elemente eines GUIs manipuliert werden, werden in diesem Zusammenhang auch als Events bezeichnet. In Java werden grundsätzlich die folgenden Events verarbeitet: Betätigung der Maustasten (sog. Mausklicks), Mausbewegungen, Betätigungen der Tastatur und Betätigungen von GUI-Elementen wie Slider oder Pop-Up-Menüs. An dieser Stelle muss nachdrücklich darauf hingewiesen werden, dass sich das Event-Konzept von Java speziell zwischen der Version 1.02 und der Version 1.1 grundlegend verändert wird. Thema dieses Kapitels sind jedoch nur die neueren Verarbeitungsmöglichkeiten von Events. Event-Modell Grundsätzlich werden dynamische GUI-Elemente in Java durch Interfaces realisiert. Der Leser sollte den Grund hierfür bereits kennen: Soll bspw. eine Mausbewegung in einem GUI-Element erfasst werden, so muss dieselbe Funktionalität für derart unterschiedliche Komponenten wie Buttons, Slider, Textbereiche oder Canvas-Elemente angeboten werden. Die Definition einer abstrakten Funktionalität für verschiedene Anwendungsbereiche ist aber genau Aufgabe eines Interface. Im Event-Modell, das im AWT von Java verwendet wird, werden Events stets von sog. Event-Quellen generiert. Sogenannte Listener können sich dann für eine Quelle registrieren lassen und werden benachrichtigt, wenn ein Event eingetreten ist, für den sie registriert sind. Innerhalb dieses Event-Modells können Events einerseits abgearbeitet, andererseits aber auch erzeugt werden. Aufgrund der Realisierung in Form eines Interface können Event-Handler, also die Funktionskomponenten, die Events bearbeiten, Instanz jeglicher Klasse sein. Eine Voraussetzung hierfür ist allerdings wie bei jedem anderen Interface auch, dass eine Klasse das Interface eines Event-Listeners implementiert. Jedes Programm, das über einen Event-Handler verfügt, beinhaltet daher die folgenden drei Code-Bestandteile:
public class beispielklasse implements ActionListener {....}
// Code, der als Reaktion auf den Event ausgeführt wird } Das folgende Beispiel demonstriert die Verwendung des Event-Konzepts. Hierzu wird ein Applet verwendet, das einen Quit-Button enthält. Wird dieser betätigt, so wird die Ausgabe „Ende" erzeugt. Die Klasse QuitButton implementiert hierbei das Interface ActionListener, das die Methode actionPerformed enthält. Aufgrund dieser Implementierung kann ein QuitButton-Objekt als ein Listener-Objekt fungieren (Registrierung), das Events auffängt, die der Button erzeugt. Nachdem die Registrierung stattgefunden hat, wird die Methode actionPerformed jedes Mal aufgerufen, wenn der Button betätigt wird.
import java.applet.*; Button ende = new Button("Quit"); add(ende); } System.out.println("Ende"); } } Das im obigen Beispiel dargestellte Event-Modell ist umfassend und flexibel. Eine beliebige Anzahl von Event-Listener-Objekten kann auf beliebige Arten von Events warten, die von einer beliebigen Anzahl von Quellobjekten erzeugt werden. Ein Programm könnte bspw. einen Listener pro Event-Quelle generieren, aber auch lediglich einen Listener für alle Events aller Quellen verwenden. Darüber hinaus kann ein Programm aber auch mehr als einen Listener für einen einzigen Event, der von einer einzigen Quelle generiert wird, verwenden. Im Folgenden werden zunächst Adapter und anschließend die Verarbeitung der verschiedenen Event-Arten einzeln betrachtet. Adapter und innere Klassen Das oben dargestellte Beispiel verwendete mit ActionListener ein Interface, das nur eine einzige Methode enthält. Dies ist allerdings nicht der Regelfall. Das Interface MouseListener beinhaltet bspw. die folgenden fünf Methoden, die die mit der Maus erzeugbaren Events reflektieren: mousePressed (Maustaste gedrückt), mouseReleased (Maustaste losgelassen), mouseEntered (Maus über einer GUI-Komponente), mouseExited (Maus nicht mehr über einer GUI-Komponente) und mouseClicked (Maustaste betätigt). Diese Methoden müssen alle implementiert werden, wenn das Interface eingesetzt werden soll, selbst dann, wenn nur eine Teilmenge der Funktionalität erforderlich ist. Die dann implementierten Methoden haben meist einen leeren Rumpf, der bspw. wie folgt aussieht:
public void mousePressed(MouseEvent e) {} Es ist offensichtlich, dass so große Mengen an Code generiert werden, die das Lesen des gesamten Programms und damit auch dessen Wartung erheblich erschweren. Um dieses Problem zu lösen, stehen im Java-AWT sog. Adapterklassen für jedes Listener-Interface, das mehr als eine Methode enthält, zur Verfügung. Eine Adapterklasse implementiert jeweils alle Versionen des dazugehörigen Interfaces mit einem leeren Methodenrumpf. Die Klasse MouseAdapter implementiert bspw. das Interface MouseListener. Um eine Adapterklasse verwenden zu können, muss eine Subklasse des Adapters erzeugt werden, anstatt ein Interface eines Listeners direkt zu implementieren. Indem bspw. eine Subklasse der Klasse MouseAdapter angelegt wird, erbt diese die leeren Definitionen aller Methoden, die das Interface MouseListener enthält. Das folgende Beispiel demonstriert die Verwendung von Adapterklassen:
public class beispielKlasse extends MouseAdapter { //.... //Implementierung des Event-Handlers } } Problematisch ist allerdings, dass Java keine Mehrfachvererbung zulässt. Soll nun ein Applet geschrieben werden, das eine Subklasse enthält, die Maus-Events verarbeitet, so müsste das Applet theoretisch eine Subklasse der Klassen Applet und MouseAdapter sein, also mehrfach erben. Um dieses Problem zu lösen, müssen innere Klassen innerhalb der Applet-Subklasse definiert werden, die von der Klasse MouseAdapter erben. Ein Beispiel hierfür ist im Folgenden angegeben.
public class beispielKlasse extends Applet { //.... public void mouseClicked(MouseEvent e) { //Implementierung des Event-Handlers } } } Innere Klassen sollten immer dann verwendet werden, wenn ein Event-Handler als private gekennzeichnete Instanzvariablen von einer umgebenden Klasse aus benutzen soll. Solange eine innere Klasse nicht als static bezeichnet wird, kann sie Instanzvariablen und Methoden referenzieren, wie wenn der Code in der Klasse selbst wäre. Um innerhalb einer inneren Klasse eine lokale Variable verwenden zu können, sollte eine Kopie der Variablen als lokale Variable, die als final gekennzeichnet wird, erstellt werden. Event Listener Nachdem die Funktion der Event-Verarbeitung in Java allgemein erläutert wurde, werden die Event-Arten im Folgenden einzeln betrachtet. Eine Übersicht hierzu ist in Tab. 4-4 angegeben. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Tab. 4.4: Event-Verarbeitung AWT-Events können nach ihrer Komplexität in Events einer niedrigen Komplexität und in semantische Events unterschieden werden. Events einer niedrigen Komplexität sind bspw. Fensteroperationen oder Eingaben mit der Maus oder mit der Tastatur. Auch Komponenten-, Container-, Fokus- und Fenster-Events zählen zu dieser ersten Klasse von Events. Komponenten-Events ermöglichen es dem Anwender, Änderungen der Position, der Größe oder der Sichtbarkeit von GUI-Elementen zu überwachen. Container-Events werden dann verwendet, wenn eine Komponente einem Container hinzugefügt oder von diesem entfernt wird. Fokus-Events stellen fest, ob eine Komponente im Tastaturfokus ist, ob sie also Zeichen, die auf der Tastatur getippt werden, empfangen kann, oder ob die Komponente den Fokus verloren hat. Fenster-Events informieren den Benutzer über den Zustand von Fenstern, bspw. von Dialogfenstern. Maus-Events lassen sich ebenfalls in zwei Gruppen einteilen: Bewegungs-Events der Maus und alle weiteren Events, die eine Maus generieren kann. Semantische Events beinhalten Aktions-, Anpassungs- und Text-Events sowie solche Events, die von bestimmten Elementen, wie bspw. Einträgen eines Menüs, generiert werden. Diese Events haben die Eigenschaft gemeinsam, ein Resultat einer komponentenspezifischen Benutzerinteraktion zu sein. Ein Button erzeugt bspw. einen Action-Event, wenn er einmal betätigt wird, während dies bei einer Liste erst nach einem Doppelklick erfolgt. Text-Events treten immer dann auf, wenn sich der Text eines Textfeldes oder eines Textbereichs verändert. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Tab. 4.5: Events und Komponenten Interface ActionListener Action-Listener werden häufig eingesetzt und sind eine einfache Form von Event-Handlern. Ein Action-Listener wird immer dann verwendet, wenn auf eine implementierungsabhängige Aktion eines Benutzers reagiert werden soll. Derartige Aktionen können bspw. das Betätigen eines Buttons, die Auswahl eines Listeneintrages oder auch Tastatureingaben sein. Tritt eine derartige Aktion ein, so wird eine actionPerformed-Nachricht generiert, die an alle Action-Listener gesendet wird, die sich für die Komponente registriert haben, die den Event auslöst. Das Interface ActionListener enthält lediglich eine einzige Methode, actionPerformed(ActionEvent), die als Parameter ein Objekt vom Typ ActionEvent erwartet. Die Klasse ActionEvent definiert die folgenden Methoden:
import java.applet.*; Button ende = new Button("Quit"); add(ende); } System.out.println("Ende"); } } Interface AdjustmentListener Adjustment-Events benachrichtigen den Anwender über Änderungen von Komponentenwerten, die das Interface Adjustable implementieren. Anpassungsfähige Objekte verwenden einen ganzzahligen Wert und generieren einen Adjustment-Event, wenn dieser Wert verändert wird. Als einzige AWT-Klasse wird dieses Interface von der Klasse Scrollbar implementiert. In Java werden die folgenden Adjustment-Events verwendet:
Das folgende Beispiel demonstriert die Anwendung dieses Interfaces, indem ein Event-Handler für einen Adjustment-Listener implementiert wird. //... //... } // Reaktion auf Ausloesen des Sliders } } Interface ComponentListener Komponenten-Events werden von einem Komponentenobjekt immer dann generiert, wenn eine Komponente sichtbar oder unsichtbar, verschoben oder verkleinert bzw. vergrößert wird. Ein Beispiel eines Komponenten-Listeners könnte ein GUI-Entwicklungswerkzeug sein, in dem Informationen über die Eigenschaften einer selektierten Komponente angezeigt werden. Im Regelfall wird aber ein derartiges Wissen nicht benötigt. Events der Art „Komponente sichtbar" treten nur dann auf, wenn die Komponentenmethode setVisible aufgerufen wurde. Wird bspw. ein Fenster ikonifiziert, so wird ein derartiger Event ausgelöst. Das Interface ComponentListener bzw. die hierzu gehörende Adapterklasse ComponentAdapter beinhaltet die folgenden vier Methoden:
Jede Methode der Klasse Das folgende Applet demonstriert die Verwendung von Komponenten-Events. Das Applet enthält einen Knopf, dessen Betätigung ein neues Fenster (ein Frame-Objekt) öffnet. Verlässt man die Webseite, die das Applet enthält, so wird dieses unsichtbar. Analog wird es wieder angezeigt, wenn die Seite erneut geöffnet wird. Ein Textbereich stellt eine dementsprechende Nachricht jedes Mal dar, wenn ein derartiger Komponenten-Event ausgelöst wird.
import java.applet.Applet; Frame f; Button b = new Button("Start"); } if (e.getActionCommand() == "Zeige") { showIt = true; } } f.setVisible(false); } if (showIt) f.setVisible(true); } System.out.println("Komponente verborgen"); } public void componentMoved(ComponentEvent e) { System.out.println("Komponente verschoben"); } System.out.println("Komponentengroesse veraendert"); } System.out.println("Komponente sichtbar"); } } Interface ContainerListener Container-Events werden von einem Container immer dann ausgelöst, wenn eine Komponente einem Container hinzugefügt wurde, oder wenn eine Komponente entfernt wurde. Das Interface ContainerListener bzw. seine Adapterklasse, ContainerAdapter, enthalten die Methoden:
Das folgende Beispiel demonstriert die Verwendung der Container-Events. Hierbei ist ausschnittsweise ein Programm angegeben, das Container-Events feststellt. Die Anwendung generiert diese Events immer dann, wenn eine Button-Komponente einem Panel hinzugefügt wurde oder entsprechend, wenn diese entfernt wurde. //... //... } // Reaktion auf Hinzufuegen einer Komponente } // Reaktion auf Entfernen einer Komponente } } Interface FocusListener Focus-Events werden dann generiert, wenn eine Komponente die Möglichkeit erhält, Tastatur-Events zu empfangen bzw., wenn sie diese wieder verliert. Aus Sicht des Anwenders ist die Verwendung einer Komponente, die momentan den Tastaturfokus hat, leicht erkennbar, da diese bspw. eine dickere Begrenzungslinie ausweist bzw. da das Fenster, das die Komponente enthält, besonders gekennzeichnet ist. In Windows 98 der Firma Microsoft ist bspw. der obere Rand eines Fensters, das den Tastaturfokus hat, blau gefärbt, während alle anderen Fenster grau gefärbt sind. Es ist dadurch auch verständlich, dass stets nur eine Komponente den Tastaturfokus haben kann, nie jedoch mehrere gleichzeitig. Die genaue Art und Weise, in der Komponenten den Tastaturfokus erhalten, hängt zu einem großen Teil vom verwendeten Fenstersystem ab. Typischerweise setzt ein Benutzer den Fokus, indem er auf ein Fenster oder auf eine Komponente klickt. Soll eine Komponente den Fokus erhalten, so kann aber auch die Methode requestFocus einer Komponente aufgerufen werden. Das Interface FocusListener bzw. seine Adapterklasse FocusAdapter enthalten die folgenden zwei Methoden:
Die Fokus-Event-Methoden erwarten jeweils einen Parameter: Ein Objekt vom Typ Oftmals wird die Methode getComponent, die in ComponentEvent definiert ist, dazu eingesetzt, einem FocusEvent-Objekt mitzuteilen, welche Komponente den Fokus gewonnen oder verloren und damit den Fokus-Event ausgelöst hat. Das folgende Beispiel demonstriert die Verwendung von Fokus-Events. Indem der obere der beiden Buttons gedrückt wird, wird ein Fenster geöffnet, das ein Textfeld und einen weiteren Button enthält. Ein Fokus-Listener überwacht das Auftreten von Fokus-Events, die die einzelnen Komponenten des Fensters auslösen können. Zur Realisierung des Fokus-Fensters wird eine neue Klasse FocusFenster mit Hilfe des Konstruktors der Superklasse Frame erzeugt. Die Ausgabe des Applets ist in Abb. 4-35 dargestellt.
import java.awt.*; TextArea anzeige; b1 = new Button("Öffnen des Fensters."); } fenster.setVisible(false); } nachricht("Fokus erhalten", e); } nachricht("Fokus verloren", e); } anzeige.append(n+ ": "+ e.getComponent() + neueZeile); } if (e.getActionCommand() == ZEIGE) { fenster.pack(); } else { //LOESCHE anzeige.setText(""); } } } class FocusFenster extends Frame { public FocusFenster(FocusListener l) { //Verwende Konstruktor der Superklasse Frame } }
Abb. 4.35: Fokus-Applet Interface ItemListener Item-Events werden von Komponenten generiert, die das Interface ItemSelectable implementieren, und die den Status (bspw. „an" oder „aus") von Listen- oder Menüeinträgen überwachen sollen. In Java können Checkboxen, Menüeinträge in Form von Checkboxen, Auswahllisten und Listen derartige Events auslösen. Das Interface ItemListener besteht lediglich aus einer einzigen Methode, void itemStateChanged(ItemEvent), weshalb die Verwendung einer Adapterklasse überflüssig ist. Diese Methode wird vom AWT unmittelbar nach einer Zustandsänderung einer Komponente aufgerufen, für die ein Listener registriert ist, und erwartet als Parameter ein Objekt vom Typ ItemEvent. Die Klasse ItemEvent definiert die folgenden Methoden:
Der folgende Code-Ausschnitt demonstriert die Funktionsweise von Item-Events. //... //... } if (e.getStateChange() == ItemEvent.SELECTED) { //Aktion dementsprechend ausfuehren } else { //Aktion dementsprechend ausfuehren } }//... } Interface KeyListener Key-Events werden dann ausgelöst, wenn ein Anwender die Tastatur verwendet, bzw. präziser formuliert, wenn der Anwender Tastaturkomponenten aus dem GUI-Element heraus betätigt, das den Fokus der Tastatur derzeitig besitzt (hierzu vergleiche die Funktion der Focus-Listener). Eine Benachrichtigung in Form eines Events kann weiterhin unterschieden werden in das Tippen eines Unicode-Zeichens (sog. Key-typed-Events) bzw. in das Drücken und Loslassen einer Taste der Tastatur (sog. Key-pressed-Events bzw. Key-released-Events). Java verwendet hierzu das Unicode-Zeichenset, in dem die Standardbuchstaben und viele weitere Zeichen internationaler Alphabete enthalten sind. Derartige Zeichen können in jeder Java-Implementierung verwendet werden, wenn sie eine Unicode-Nummer haben. Diese Nummern sind bspw. unter der URL http://www.unicode.org zu finden. Im Allgemeinen sollten stets Key-pressed-Events verwendet werden, es sei denn, es soll festgestellt werden, wann ein Anwender eine Taste drückt, die zu einem bestimmten Zeichen gehört. Soll bspw. überwacht werden, wann der Anwender ein Unicode-Zeichen tippt (bzw. eine Sequenz derartiger Zeichen), so sollten Key-typed-Events verwendet werden. Soll andererseits festgestellt werden, wann der Benutzer eine der Funktionstasten (bspw. F10) betätigt, so sollten Key-pressed- bzw. Key-released-Events eingesetzt werden. Beide Event-Arten setzen immer voraus, dass eine GUI-Komponente den Tastaturfokus besitzt. Der Tastaturfokus einer Komponente kann wie folgt gesetzt werden:
Das Interface KeyListener bzw. die dazugehörige Adapterklasse KeyAdapter enthalten die folgenden drei Methoden:
Die Klasse Das folgende
import java.applet.Applet; TextField tippBereich; tippBereich = new TextField(20); } System.out.println("Taste getippt"); } anzeige(e,"Taste gedrueckt: "); } System.out.println("Taste losgelassen"); } String charS, keyS; } }
Abb. 4.36: Key-Events Interface MouseListener Maus-Listener gehören zu den am häufigsten verwendeten Event-Handlern. Maus-Events werden dann ausgelöst, wenn ein Anwender die Maus (oder ein ähnliches Eingabegeräte) verwendet und damit bspw. den Cursor in den Bildschirmbereich einer Komponente hinein- oder herausbewegt bzw. dann, wenn ein Mausknopf betätigt wird. Die Überwachung der Cursor-Aktivität verursacht dabei eine weit höhere Maschinenauslastung als das Feststellen sonstiger Mausaktivitäten. Events, die bei der Bewegung der Maus ausgelöst werden, werden daher von einem separaten Listener-Typ überwacht, der im nächsten Abschnitt beschrieben wird. Das Interface MouseListener bzw. die Adapterklasse MouseAdapter beinhalten die folgenden Methoden:
Ein Problem ergibt sich hierbei bei Events, die das Bewegen der Maus in eine Komponente, aus dieser heraus bzw. das Loslassen des Mausknopfs betreffen. Wenn der Anwender die Maus derart verwendet, dass diese bei gedrücktem Knopf bewegt wird (sog. Dragging), so empfängt die Komponente, in der das Dragging begonnen wurde, alle folgenden Maus-Events, also auch jene, die das Loslassen des Mausknopfs repräsentieren. Dies impliziert aber, dass keine andere Komponente in dieser Zeit Maus-Events empfangen kann, auch solche nicht, die das Loslassen des Mausknopfs anzeigen. Jede der obigen Maus-Event-Methoden erwartet als Parameter ein Objekt vom Typ Das folgende Beispiel demonstriert die Verwendung von Maus-Listenern. In einem Applet wird ein leerer Bereich von einem Maus-Listener überwacht. Findet dort ein Maus-Event statt, so wird ein Text in der Kommandozeile ausgegeben. Die Ausgabe dieses Beispiels findet sich in Abb. 4-37.
import java.applet.Applet; Bereich bereich; bereich = new Bereich(); } System.out.println("Maus gedrueckt: Anzahl Klicks: " + e.getClickCount()+"\n"); } System.out.println("Maus losgelassen: Anzahl Klicks: " + e.getClickCount()+ "\n"); } System.out.println("Maus im Bereich"); } System.out.println("Maus ausserhalb des Bereichs"); } System.out.println("Maus geklickt: Anzahl Klicks: " + e.getClickCount() +"\n"); } } public void paint(Graphics g) { g.drawRect(0, 0, 90, 180); } }
Abb. 4.37: Maus-Events Interface MouseMotionListener Mausbewegungs-Events treten dann auf, wenn der Benutzer den Bildschirm-Cursor mit der Maus oder mit einem ähnlichen Eingabegerät bewegt. Das Interface MouseMotionListener und die hierzu gehörende Adapterklasse MouseMotionAdapter enthalten die folgenden Methoden:
Jede Methode zum Abfangen von Mausbewegungs-Events erwartet einen Parameter vom Typ
public class MausBeispiel-2 extends MouseAdapter implements MouseMotionListener { // ..... Initialisierung vorab ... System.out.println("Maus gezogen nach: " + e.getX() +", " + e.getY() + ")\n"); } //kann aehnlich wie mouseDragged implementiert werden } System.out.println("Maus gedrueckt: Anzahl Klicks: " + e.getClickCount()+"\n"); } System.out.println("Maus losgelassen: Anzahl Klicks: " + e.getClickCount()+ "\n"); } System.out.println("Maus im Bereich"); } System.out.println("Maus ausserhalb des Bereichs"); } System.out.println("Maus geklickt: Anzahl Klicks: " + e.getClickCount() +"\n"); } } Interface TextListener Text-Events werden generiert, nachdem der Text einer Textkomponente verändert wurde. Hierzu stehen in Java Textfelder und Textbereiche zur Verfügung. Um bereits frühzeitig über Textänderungen benachrichtigt zu werden, muss ein Key-Listener verwendet werden. Key-Listener wurden in diesem Kapitel bereits erläutert. Das Interface TextListener beinhaltet eine Methode, void textValueChanged(TextEvent), die vom AWT aufgerufen wird, nachdem sich der Text einer Komponente ändert, die von einem Listener überwacht wird. Eine Adapterklasse ist deshalb nicht erforderlich. Die Text-Event-Methode verwendet als Parameter ein Objekt vom Typ TextEvent. Weiterhin kann die Methode getSource verwendet werden, die TextEvent von der Klasse EventObject erbt, um die Komponente abzufragen, die den Event ausgelöst hat. Window-Listener Fenster-Events werden dann generiert, wenn ein Fenster geöffnet, geschlossen, (de)ikonifiziert oder (de)aktiviert wird. Ein Fenster ist dann aktiviert, wenn es den Tastaturfokus hat, anderenfalls deaktiviert. Window-Listener werden hauptsächlich dazu eingesetzt, um das Schließen von Fenstern zu überwachen. Wird dieser Vorgang nicht überwacht, so geschieht dann nichts, wenn ein Benutzer ein Fenster schließen möchte. Erst das Erfassen des Events, gekoppelt mit der Anweisung, ein Fenster zu schließen, resultiert in der gewünschten Aktion. Dies impliziert, dass eine Anwendung, die lediglich aus einem Fenster besteht, beendet wird, wenn dieses Fenster geschlossen wird. Eine weitere wichtige Aufgabe der Window-Listener ist das Anhalten von Threads bzw. die Freigabe von Ressourcen, wenn ein Fenster ikonifiziert wird, bzw. das Neustarten eines Threads, wenn ein Fenster wieder geöffnet wird. Zur Benachrichtigung, dass ein Fenster erscheint oder verschwindet, muss ein Komponenten-Listener für das entsprechende Fenster registriert werden. Das Interface WindowListener bzw. die Adapterklasse WindowAdapter enthalten die folgenden Methoden:
Jede dieser Methoden verwendet einen Parameter, ein Objekt vom Typ
public class FensterBeispiel implements WindowListener { // ..... } window.setVisible(false); } System.out.println("Fenster geschlossen"); } System.out.println("Fenster geoeffnet"); } System.out.println("Fenster ikonifiziert"); } System.out.println("Fenster deikonifiziert"); } System.out.println("Fenster aktiviert"); } System.out.println("Fenster deaktiviert"); } } |
|
|