From 33613a85afc4b1481367fbe92a17ee59c240250b Mon Sep 17 00:00:00 2001 From: Sven Eisenhauer Date: Fri, 10 Nov 2023 15:11:48 +0100 Subject: add new repo --- .../hjp5/html/k100189.html | 312 +++++++++++++++++++++ 1 file changed, 312 insertions(+) create mode 100644 Master/Reference Architectures and Patterns/hjp5/html/k100189.html (limited to 'Master/Reference Architectures and Patterns/hjp5/html/k100189.html') diff --git a/Master/Reference Architectures and Patterns/hjp5/html/k100189.html b/Master/Reference Architectures and Patterns/hjp5/html/k100189.html new file mode 100644 index 0000000..bc4c0af --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/html/k100189.html @@ -0,0 +1,312 @@ + + + +Handbuch der Java-Programmierung, 5. Auflage + + + + + + + + + +
 Titel  + Inhalt  + Suchen  + Index  + DOC  +Handbuch der Java-Programmierung, 5. Auflage +
 <<  +  <   +  >   + >>  + API  +Kapitel 29 - Low-Level-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 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 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, +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 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, 5. Auflage, Addison +Wesley, Version 5.0.1 +
 <<  +  <   +  >   + >>  + API  +© 1998, 2007 Guido Krüger & Thomas +Stark, http://www.javabuch.de +
+ + + -- cgit v1.2.3