Die Schnittstelle IWindow
stellt gemeinsamen
Funktionen für Fenster bereits. IWindow
erweitert
IDisplay
und somit auch
IWidget
.
Es folgt eine kurze Übersicht der wichtigsten Methoden:
Ein Kind Fenster lässt sich mit Hilfe der folgenden Methode erzeugen:
<WIDGET_TYPE extends IDisplay, DESCRIPTOR_TYPE extends IWidgetDescriptor<WIDGET_TYPE>> WIDGET_TYPE createChildWindow(final DESCRIPTOR_TYPE descriptor);
Ein Kind Fenster wird mit Hilfe eines BluePrint
(IWidgetDescriptor) erzeugt. Dieses wird der Methode
createChildWindow()
übergeben, welche das
erzeugte Fenster zurück gibt.
Im folgenden Beispiel wird so ein FileChooser zum Öffnen einer Datei erstellt:
1 IFileChooserBluePrint fileChooserBp = BPF.fileChooser(FileChooserType.OPEN_FILE); 2 final IFileChooser fileChooser = frame.createChildWindow(fileChooserBp); 3 final DialogResult result = fileChooser.open(); 4 if (DialogResult.OK.equals(result)) { 5 System.out.println(fileChooser.getSelectedFiles()); 6 }
Die folgende Methode liefert die Kind Fenster eines Fensters.
List<IDisplay> getChildWindows();
Dabei handelt es sich um eine nicht modifizierbare Kopie aller aktuell vorhandenen Kind Fenster. Fenster die bereits disposed wurden, sind nicht enthalten.
Im obigen Beispiel würde ein Aufruf von
getChildWindows()
zwischen Zeile 2 und
Zeile 3 eine Referenz auf den erzeugten File Chooser
enthalten, und bei einem Aufruf nach Zeile 3 nicht mehr, da
der Aufruf open()
blockiert, bis der File
Chooser wieder geschlossen wird, und anschließend das
FileChooser Fenster automatisch disposed wurde.
Die folgenden Methoden können verwendet werden um
IWindowListener
zu registrieren oder zu
deregistrieren:
void addWindowListener(IWindowListener listener); void removeWindowListener(IWindowListener listener);
Ein IWindowListener
hat die folgenden
Methoden:
void windowActivated(); void windowDeactivated(); void windowIconified(); void windowDeiconified(); void windowClosing(IVetoable vetoable); void windowClosed();
In einer Fenster basierten Anwendung kann zur selben Zeit
genau ein Fenster aktiv sein. Die Methoden
windowActivated()
und
windowDeactivated()
informieren über eine
Änderung des active
Status. Die Methode
Toolkit.getActiveWindow() liefert das gerade aktive Fenster.
Die Methode
windowClosing(IVetoable vetoable)
wird
aufgerufen, bevor ein Fenster geschlossen werden soll. Mit
Hilfe des vetoable
hat man die Möglichkeit,
das Schließen zu verhindern. Das folgende Beispiel soll dies
verdeutlichen:
1 frame.addWindowListener(new WindowAdapter() {
2 @Override
3 public void windowClosing(final IVetoable vetoable) {
4 final String msg = "Close Window?";
5 final QuestionResult questionResult = QuestionPane.askYesNoQuestion(msg, msg);
6 if (!QuestionResult.YES.equals(questionResult)) {
7 vetoable.veto();
8 }
9 }
10 });
Beim Schließen des Fensters wird ein
QuestionDialog
angezeigt, um den Nutzer zu fragen, ob das Fenster wirklich
geschlossen werden soll. Falls nicht wird in Zeile 7 ein
Veto eingelegt, wodurch das Fenster nicht
geschlossen wird. Die folgende Abbildung zeigt das Ergebnis
nachdem das X
zum Schließen gedrückt wurde:
Die Methode windowClosed()
wird aufgerufen,
nachdem das Fenster geschlossen wurden.
Achtung: Wenn ein Fenster
geschlossen, bedeutet dies nicht automatisch, das das Fenster
dann auch disposed ist.
Die Klasse
org.jowidgets.tools.controller.WindowAdapter
implementiert die IWindowListener
Schnittstelle mit leeren Methodenrümpfen und kann verwendet
werden, falls nicht alle Methoden implementiert werden sollen.
Die Methode pack
void pack();
sorgt dafür, das für das Fenster die
PreferredSize
berechnet und gesetzt wird.
Anschließend wird auf dem zugehörigen Container ein
layout()
durchgeführt.
Mit Hilfe der folgenden Methoden kann das
pack()
beeinflußt werden:
void setMinPackSize(Dimension size); void setMaxPackSize(Dimension size);
Die MinPackSize
legt eine minimale Größe
fest, die das Fenster mindestens (trotz pack) haben soll.
Dadurch kann zum Beispiel verhindert werden, dass ein Fenster
mit dynamisch erzeugten Inhalt zu klein
angezeigt wird.
Die MaxPackSize
legt eine maximale Größe
fest, die das Fenster höchsten (trotz pack) haben soll.
Dadurch kann zum Beispiel verhindert werden, dass ein Fenster
mit dynamisch erzeugten Inhalt zu groß
angezeigt wird.
Die folgende Methode:
Rectangle getParentBounds();
liefert die ParentBounds
. Ist das Fenster
ein Root Fenster (getParent() == null
)
werden die Bounds des Bildschirm zurückgegeben. Ist es ein
Kind Fenster, werden die Bounds des Vaters zurückgegeben. Die
Methode liefert somit nie null
zurück. Dies
kann zum Beispiel hilfreich sein, um ein Fenster relativ zum
Vater anzuzeigen, ohne vorab überprüfen zum müssen, ob es sich
um ein Root Fenster oder ein Kind Fenster handelt.
Die folgende Methode:
void centerLocation();
setzt die Position des Fensters so, das es zentriert zu den
ParentBounds
angezeigt wird. Root Fenster
werden somit zentriert auf dem Bildschirm angezeigt, Kind
Fenster zentriert bezüglich des Vater Fensters. Dabei haben
beide Fenster dann den gleichen Mittelpunkt.