15.4 Das Swing-Fenster JFrame
 
Die Swing-Variante von Frame ist JFrame. Wir werden im Folgenden unsere Programme alle auf Swing aufbauen und daher auch immer JFrame nutzen. Große Unterschiede in den Methoden existieren nicht. Lediglich das Kind-Management ist etwas anders.
15.4.1 Kinder auf einem Swing-Fenster
 
Um beim AWT-Programm ein Objekt zu einem Fenster hinzuzufügen, schreiben wir
frame.add( component );
Da die Frame-Klasse nichts anderes ist als ein spezielles Container-Objekt, erbt es von dort die add()-Methode, die ein Component-Objekt auf sich lässt. Bei Swing ist dies etwas anders. Zwar ist auch JFrame vom Frame abgeleitet, doch das Container-Management ist verschieden. Es gibt nicht nur einen Container, sondern viele, und wir müssen uns einen Zeichenbereich aussuchen. Für allgemeine Komponenten wird das die sogenannte »Content-Pane« sein. Sie wird mit getContentPane() erfragt und ist ein normaler Container.
Container con = frame.getContentPane();
con.add( component );
Dies lässt sich dann zu einer Anweisung abkürzen: frame.getContentPane().add( component );
Da die Schreibweise verglichen mit dem Frame eine Umgewöhnung bedarf, hat Sun in Java 1.5 die add()-Methode so implementiert, dass sie automatisch die Komponenten auf die Content-Pane legt. Vor Java 1.5 gab es eine Fehlermeldung wie
Exception in thread "main" java.lang.Error:
Do not use javax.swing.JFrame.add()
use javax.swing.JFrame.getContentPane().add() instead
at javax.swing.JFrame.createRootPaneException(Unknown Source)
at javax.swing.JFrame.addImpl(Unknown Source)
at java.awt.Container.add(Unknown Source)
at JDemo.main(JDemo.java:18)
15.4.2 Schließen eines Swing-Fensters
 
Wird ein Fenster geschlossen, verhält sich der JFrame nicht genauso wie ein AWT-Frame. Beim herkömmlichen Frame läuft ohne Ereignisbehandlung erst einmal gar nichts. Beim JFrame verschwindet das Fenster jedoch in den Hintergrund, wird also geschlossen, aber die Applikation nicht beendet. Dieses Verhalten kann mit der Funktion setDefaultCloseOperation(int) geändert werden. Damit ein JFrame sich wie ein Frame verhält, geben wir Folgendes an:
setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );
Immer noch lässt sich mit Hilfe eines WindowListener-Objekts auf windowClosing() reagieren.
Neben DO_NOTHING_ON_CLOSE existieren drei weitere Konstanten. HIDE_ON_CLOSE und DISPOSE_ON_CLOSE sind ebenfalls in WindowConstants definiert und kennzeichnen zum einen, ob das Fenster automatisch verdeckt werden soll, nachdem die WindowsListener aufgerufen wurden (dies ist der Standard), und zum anderen, ob alle Listener abgearbeitet werden und das Fenster geschlossen werden soll. Die letzte Konstante ist EXIT_ON_CLOSE in JFrame. Sie ruft System.exit() auf und schließt somit die Anwendung.
Beispiel Schließe die Applikation, wenn das Fenster geschlossen wird.
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
|
class javax.swing. JFrame
extends Frame
implements WindowConstants, Accessible, RootPaneContainer
|
|
void setDefaultCloseOperation( int operation )
Bestimmt, was passieren soll, wenn der Benutzer das Fenster schließt. Gültig sind die Konstanten WindowConstants.DO_NOTHING_ON_CLOSE, WindowConstants.HIDE_ON_CLOSE, WindowConstants.DISPOSE_ON_CLOSE, JFrame.EXIT_ON_CLOSE. |
|
int getDefaultCloseOperation()
Liefert die eingestellte Eigenschaft beim Schließen des Fensters. |
15.4.3 JWindow und JDialog
 
Ein JFrame ist ein Fenster, das standardmäßig eine Dekoration besitzt. Ein java.awt.Windows besitzt diese Dekoration nicht, so dass diese Fläche als Willkommensschirm oder als komplette Zeichenfläche genutzt werden kann. javax.Swing.JWindow ist die Swing-Unterklasse von Window. Anders als der JFrame (bis Java Version 1.5) lassen sich einem JWindow Kinder direkt mit add() zuweisen.
Bildet eine Java-Applikation zwei Fenster, so kann der Anwender zwischen beiden Fenstern hin und herschalten. Es ist nicht möglich, ein Fenster aufzubauen und dort Eingaben zu erzwingen während das andere Fenster gesperrt ist. Dafür gibt es in Java spezielle Fenster, die Dialoge. Unter dem AWT ist das die Klasse java.awt.Dialog, unter Swing javax.swing.JDialog, was eine Unterklasse von Dialog ist. Dialog wiederum ist eine Spezialisierung von Window. Ist ein Dialog im Zustand modal, muss erst der Dialog beendet werden, damit es in einem anderen Fenster weitergehen kann. Wenn mehrere Fenster gleichzeitig offen sind und Eingaben annehmen können, nennt sich dieser Zustand nicht-modal.
JFrame f1 = new JFrame();
JFrame f2 = new JFrame();
f1.add( new JTextField() );
f2.add( new JTextField() );
f1.setSize( 100, 100 ); f1.setVisible( true );
f2.setSize( 100, 100 ); f2.setVisible( true );
JDialog d = new JDialog(); // nicht modal
d.add( new JTextField() );
d.setSize( 100, 100 ); d.setVisible( true );
Soll der Dialog modal sein, ist ein übergeordnetes Fenster und ein Wahrheitswert false für den Modalitätstyp einzusetzen.
|