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. Sonst erscheint bei Frame.add() ein Fehler 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)
Bei JFrame ist ein anderer Weg zu gehen. Hier muss das Component-Objekt erst zu der Zeichenfläche, die »ContentPane« genannt wird, hinzugefügt werden. Eine ContentPane ist kein spezielles Objekt, sondern nur ein Container-Objekt:
Container con = frame.getContentPane();
con.add( component );
Dies lässt sich dann zu einer Zeile abkürzen, die auch im Programm genutzt wird:
frame.getContentPane().add( component );
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. |
|