Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage
<< | < | > | >> | API | Kapitel 29 - Low-Level-Events

## 29.5 Focus-Events

- 29.5 Focus-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 muß 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 `requestFocus` der Klasse `Component`, mit der eine Komponente den Fokus für sich selbst beanspruchen bzw. ihn einer anderen Komponente zuweisen kann:

    public void requestFocus()
| java.awt.Component

|  | Der explizite Umgang mit Focus-Events ist etwa bei Dialogelementen sinnvoll. Dadurch kann ein Edit-Control beispielsweise feststellen, daß das nächste Dialogelement angesprungen werden soll und ein eventuell geänderter Text zuvor gespeichert werden muß. 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 `requestFocus` aufgerufen, kann es zudem leicht zu Endlosschleifen kommen. |  |
Hinweis

Das folgende Programm zeigt die Anwendung eines `FocusListener`-Interfaces 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

Listing 29.5: Behandlung von Fokus-Ereignissen

|  | 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 Interfaces benötigt werden. Das `windowClosing`-Event wird dagegen von der in Abschnitt 23.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. Diese Technik demonstriert beispielhaft die Entwicklung spezialisierter Adapterklassen, die mehrfach verwendet werden können. |  |
Hinweis

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, 3. Auflage, Addison Wesley, Version 3.0
<< | < | > | >> | API | © 1998-2002 Guido Krüger, http://www.javabuch.de