Advanced   Java   Services
WindowFocusListener und WindowStateListener
Back Next Up Home


WindowFocusListener  und  WindowStateListener


Zwei neue ListenerInterfaces treten ergänzend zum Interface WindowListener ab 1.4. auf. Sie heißen WindowFocusListener und WindowStateListener und haben die folgende Gestalt.

public interface WindowFocusListener extends EventListener { /** * Invoked when the Window is set to be the focused Window, which means * that the Window, or one of its subcomponents, will receive keyboard * events. */ public void windowGainedFocus(WindowEvent e); /** * Invoked when the Window is no longer the focused Window, which means * that keyboard events will no longer be delivered to the Window or any of * its subcomponents. */ public void windowLostFocus(WindowEvent e); } public interface WindowStateListener extends EventListener { /** * Invoked when window state is changed. */ public void windowStateChanged(WindowEvent e); }

Beide Interfaces arbeiten also mit einem WindowEvent-Objekt und werden angenehmerweise von der Klasse WindowAdapter implementiert.

windowadapter.jpg

WindowEvent


Für die neuen ListenerInterfaces wurde die Klasse WindowEvent mit neuen Konstanten, Konstruktoren und Methoden ausgestattet, die in diesem Zusammenhang nützlich sind.

Konstanten

Konstruktoren

Methoden

Window


Hier die in diesem Zusammenhang neuen Methoden aus der Klasse Window . Für einen Gesamtüberblick schaue man in die Summary.

void addWindowFocusListener(WindowFocusListener l)
// Adds the specified window focus listener to receive window events from this window.

void addWindowStateListener(WindowStateListener l)
Adds the specified window state listener to receive window events from this window.

WindowFocusListener[] getWindowFocusListeners()
// Returns an array of all the window focus listeners registered on this window.

WindowListener[] getWindowListeners()
// Returns an array of all the window listeners registered on this window.

WindowStateListener[] getWindowStateListeners()
// Returns an array of all the window state listeners registered on this window.

boolean isFocused()
// Returns whether this Window is focused.

protected void processWindowFocusEvent(WindowEvent e)
// Processes window focus event occuring on this window by dispatching them to any registered WindowFocusListener objects.

protected void processWindowStateEvent(WindowEvent e)
// Processes window state event occuring on this window by dispatching them to any registered WindowStateListener objects.

void removeWindowFocusListener(WindowFocusListener l)
// Removes the specified window focus listener so that it no longer receives window events from this window.

void removeWindowStateListener(WindowStateListener l)
// Removes the specified window state listener so that it no longer receives window events from this window.

Frame


Auch in dieser Klasse gibt es in diesem Zusammenhang einige Neuerungen

Konstanten

Note that if the state is not supported on a given platform, nothing will happen. The application may determine if a specific state is available via the java.awt.Toolkit.isFrameStateSupported(int state) method.

Methoden



WindowFocusListenerDemo


Das Beispiel arbeitet mit drei Objekten vom Typ Frame. Jedes Fenster hat ein Statuslabel zum Anzeigen der Focuszustände. Jedes Fenster wird durch einen WindowFocusListener und einen WindowListener überwacht. Dazu wird eine innere Klasse WindowHandler angelegt, die von WindowAdapter erbt und die notwendigen Methoden überschreibt. In der Methode windowGainedFocus() wird die hauparbeit erledigt. Mit der Methode getOppositeWindow() wird hier zu dem Fenster, das den Focus erhält, das Fenster ermittelt, das den Focus verloren hat. Da drei Fenster im Spiel sind, gibt es immer eines, das weder einen Focus erhalten noch verloren hat. Die drei Fenster erhalten je nach Zustand im StatusLabel die Texte "focus gained", "opposite, focus lost" und "no opposite, no focus" . Das Fenster, das den Fokus hat, erhält eine zufällige Farbe, das opposite-Fentser erhält die Komplemtärfarbe, das dritte unbeteiligte Fenster wird schwarz.

Es kann vorkommen, daß keines der Fenster den Fokus hat, weil ein Fenster aktiv ist, das nicht Teil dieser Anwendung ist, in diesem Fall erhalten alle drei Fenster eine schwarze Farbe, das Fenster, das den Fokus verloren hat, erhält einen entsprechenden Statustext, die anderen beiden erhalten den Text "no opposite, no focus". Dieser Zustand wird ermittelt in der Methode windowLostFocus() .

import java.awt.*; import java.awt.event.*; public class WindowFocusListenerDemo { Frame wnd[] = new Frame[3] ; Label lab[] = new Label[3]; int windows=3; public WindowFocusListenerDemo() { WindowHandler wh = new WindowHandler(); for(int i=0; i<wnd.length; i++) { wnd[i] = new Frame(); lab[i] = new Label(); lab[i].setBackground( new Color(220,220,220) ); wnd[i].add(lab[i], BorderLayout.SOUTH); wnd[i].addWindowFocusListener(wh) ; wnd[i].addWindowListener(wh) ; wnd[i].setSize(300,200); wnd[i].setLocation(40+i*300,20+i*200); wnd[i].setTitle( " "+(i+1) ); } // setVisible am Ende, wenn schon alles eingerichtet ist, sonst gibt es // zu Beginn Probleme in windowGainedFocus for(int i=0; i<wnd.length; i++) wnd[i].setVisible(true); } // end constructor // inner class private class WindowHandler extends WindowAdapter { // ---- von WindowAdapter implementierte Methoden aus WindowFocusListener ---- public void windowGainedFocus(WindowEvent e) { Window focusFrame = e.getWindow() ; Window opposite = e.getOppositeWindow() ; int r = (int)(256*Math.random()) , g = (int)(256*Math.random()) , b = (int)(256*Math.random()) ; //Fenster mit focus focusFrame.setBackground( new Color(r, g, b) ); ((Label)focusFrame.getComponent(0)).setText(" focus gained"); //opposite if(opposite==null) { System.out.println("no opposite window exists"); } else // es gibt ein opposite { opposite.setBackground( new Color(255-r, 255-g, 255-b) ); // opposite erhält Komplementärfarbe ((Label)opposite.getComponent(0)).setText(" opposite , focus lost"); // drittes fenster rausfinden for(int i=0; i<wnd.length; i++) if( focusFrame!=wnd[i] && opposite!=wnd[i] ) { lab[i].setText(" no opposite , no focus"); wnd[i].setBackground(Color.black); } } } public void windowLostFocus(WindowEvent e) { // wenn hier opposite null ist, dann heißt das, daß keines // der drei fenster den focus bekommen hat !! if ( e.getOppositeWindow()==null ) { for(int i=0; i<wnd.length; i++) { lab[i].setText(" no opposite, no focus"); wnd[i].setBackground(Color.black); } ((Label)e.getWindow().getComponent(0)).setText(" focus lost"); System.out.println("all windows lost focus"); } } // ---- von WindowAdapter implementierte Methode aus WindowListener ---- public void windowClosing(WindowEvent e) { e.getWindow().dispose() ; windows--; if (windows==0) System.exit(0); } } // end inner class

top Back Next Up Home