Advanced
Java
Services
|
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.
WindowEvent
Für die neuen ListenerInterfaces wurde die Klasse WindowEvent mit neuen Konstanten, Konstruktoren
und Methoden ausgestattet, die in diesem Zusammenhang nützlich sind.
Konstruktoren
Methoden
Window
Hier die in diesem Zusammenhang neuen Methoden aus der Klasse Window . Für einen
Gesamtüberblick schaue man in die Summary.
Auch in dieser Klasse gibt es in diesem Zusammenhang einige Neuerungen
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.
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.
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
WindowFocusListener und WindowStateListener
Konstanten
// The window-gained-focus event type.
// The window-lost-focus event type.
// The window-state-changed event type.
// Constructs a WindowEvent object with the specified opposite Window.
// Constructs a WindowEvent object.
// For WINDOW_STATE_CHANGED events returns the new state of the window.
// For WINDOW_STATE_CHANGED events returns the previous state of the window.
// Returns the other Window involved in this focus or activation change.
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
Konstanten
// The window-maximized-horizontal type.
// The window-maximized-vertical type.
// Concatenates MAXIMIZED_HORIZ and MAXIMIZED_VERT.
Methoden
// Gets the state of this frame.
// Sets the state of this frame
WindowFocusListenerDemo
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() .