Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 7. Auflage |
<< | < | > | >> | API | Kapitel 29 - Low-Level-Events |
Der Fokus zeigt an, welches Fenster die Tastatureingaben erhält. Sind mehrere Fenster gleichzeitig geöffnet, so kann immer nur eines von ihnen den Fokus beanspruchen. Sind auf einem aktiven Fenster mehrere Dialogelemente aktiv, so kann ebenfalls nur eines davon den Fokus erhalten, denn jedes Dialogelement wird ebenfalls durch ein (meist unsichtbares) Fenster dargestellt.
Ein Empfänger für Focus-Events muss das Interface FocusListener implementieren und bekommt Events des Typs FocusEvent übergeben. FocusEvent erweitert die Klasse ComponentEvent und stellt neben getID und getSource die Methode isTemporary zur Verfügung, die anzeigt, ob der Fokuswechsel temporär oder permanent ist:
public boolean isTemporary() |
java.awt.event.FocusEvent |
Die Registrierung von Focus-Events erfolgt mit der Methode addFocusListener, die auf allen Objekten des Typs Component oder daraus abgeleiteten Objekten zur Verfügung steht:
public void addFocusListener(FocusListener l) |
java.awt.Component |
Das Interface FocusListener enthält lediglich zwei unterschiedliche Methoden:
public abstract void focusGained(FocusEvent e) public abstract void focusLost(FocusEvent e) |
java.awt.event.FocusListener |
focusGained wird aufgerufen, wenn die Komponente den Fokus erhält, und focusLost, wenn sie ihn wieder abgibt. Eine Komponente erhält den Fokus beispielsweise, wenn sie mit der Maus angeklickt oder (unter Windows) mit Hilfe der Tasten [TAB] oder [UMSCHALT]+[TAB] oder über einen Beschleuniger angesprungen wurde. Außerdem gibt es die Möglichkeit, den Fokus programmgesteuert zu verändern. Dazu gibt es die Methode requestFocusInWindow der Klasse Component, mit der eine Komponente den Fokus für sich selbst beanspruchen bzw. ihn einer anderen Komponente zuweisen kann:
public void requestFocus() public void requestFocusInWindow() |
java.awt.Component |
Die ältere Methode requestFocus sollte gemäß API-Dokumentation möglichst nicht mehr verwendet werden, weil sie plattformabhängig implementiert ist.
Der explizite Umgang mit Focus-Events ist etwa bei Dialogelementen sinnvoll. Dadurch kann ein Edit-Control beispielsweise feststellen, dass das nächste Dialogelement angesprungen werden soll und ein eventuell geänderter Text zuvor gespeichert werden muss. Focus-Events sind oft schwierig zu debuggen, denn durch den Wechsel zwischen Debug-Window und Anwendung werden meist zusätzliche Fokuswechsel ausgelöst, die den Fehler verschleiern oder die Fehlerstelle unerreichbar machen. Wird innerhalb von Fokus-Handlern die Methode requestFocusInWindow aufgerufen, kann es zudem leicht zu Endlosschleifen kommen. |
|
Das folgende Programm zeigt die Anwendung eines FocusListener-Interface zur Implementierung der Methoden focusGained und focusLost auf einem Frame-Objekt. Wenn das Fenster den Eingabefokus erhält, wird der Hintergrund gelb und gibt die Meldung »Fokus erhalten« aus. Verliert das Fenster den Fokus, so wird der Hintergrund grau und die Meldung »Kein Fokus« wird angezeigt. Die Registrierung des Fokusempfänger-Objekts erfolgt durch Aufruf von addFocusListener(this), bei dem das Fensterobjekt sich selbst als Empfänger registriert:
001 /* Listing2905.java */ 002 003 import java.awt.*; 004 import java.awt.event.*; 005 006 public class Listing2905 007 extends Frame 008 implements FocusListener 009 { 010 boolean havefocus = false; 011 012 public static void main(String[] args) 013 { 014 Listing2905 wnd = new Listing2905(); 015 } 016 017 public Listing2905() 018 { 019 super("Focus-Listener"); 020 addFocusListener(this); 021 addWindowListener(new WindowClosingAdapter(true)); 022 setBackground(Color.lightGray); 023 setSize(300,200); 024 setLocation(200,100); 025 setVisible(true); 026 } 027 028 public void paint(Graphics g) 029 { 030 if (havefocus) { 031 g.setColor(Color.black); 032 g.drawString("Fokus erhalten",10,50); 033 } else { 034 g.setColor(Color.darkGray); 035 g.drawString("Kein Fokus",10,50); 036 } 037 } 038 039 public void focusGained(FocusEvent event) 040 { 041 havefocus = true; 042 setBackground(Color.yellow); 043 repaint(); 044 } 045 046 public void focusLost(FocusEvent event) 047 { 048 havefocus = false; 049 setBackground(Color.lightGray); 050 repaint(); 051 } 052 } |
Listing2905.java |
Das Programm verwendet zwei unterschiedliche Techniken, um Ereignisempfänger zu registrieren. Für die Focus-Events implementiert es das FocusListener-Interface und registriert sich bei sich selbst. Dies ist eine vernünftige Vorgehensweise, da sämtliche Methoden des Interface benötigt werden. Das windowClosing-Event wird dagegen von der in Abschnitt 24.2.4 vorgestellten WindowClosingAdapter zur Verfügung gestellt, die sich aus WindowAdapter ableitet und die Methode windowClosing mit der Funktionalität zum Schließen des Fensters und zum Beenden des Programms belegt. Dieses Beispiel zeigt, dass beide Techniken auch gemischt angewendet werden können. |
|
Die Ausgabe des Programms (nachdem es den Fokus erhalten hat) ist:
Abbildung 29.4: Programm nach Erhalt des Eingabefokus
Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 7. Auflage, Addison Wesley, Version 7.0 |
<< | < | > | >> | API | © 1998, 2011 Guido Krüger & Heiko Hansen, http://www.javabuch.de |