14.3 Fenster unter grafischen Oberflächen
 
Der Anfang aller Programme unter einer grafischen Benutzeroberfläche ist das Fenster (engl. frame). Wir müssen uns daher erst mit den Fenstern beschäftigen, bevor wir auf den Inhalt näher eingehen können. Das Fenster dient auch als Grundlage von Dialogen, speziellen Fenstern, die entweder modal oder nicht modal arbeiten können. Wobei ein modaler Dialog erst bedient werden möchte, bis es mit dem Gesamtsystem weitergehen kann.
Um in ein Fenster etwas zu zeichnen, muss vorher grundsätzlich die Entscheidung für Swing oder AWT gefällt werden, da sich die jeweiligen Verfahren zum Zeichnen voneinander unterscheiden.
14.3.1 AWT-Fenster darstellen
 
Um unter dem AWT ein Fenster zu öffnen, müssen wir zunächst das awt-Paket einbinden. Dann können wir eine Klasse Frame und deren Methoden nutzen. Das Listing ist sehr kurz.
Listing 14.2
HelloAwtFrame.java
import java.awt.Frame;
public class HelloAwtFrame
{
public static void main( String[] args )
{
Frame f = new Frame( "Das Fenster zur Welt" );
f.setSize ( 300, 200 );
f.setVisible ( true );
}
}
Neben dem Standard-Konstruktor gibt es einen weiteren, bei dem wir den Namen in der Titelleiste bestimmen können, wie im Beispiel geschehen. Das Fenster kann nicht mit X in der Titelleiste geschlossen werden, da noch keine Ereignisbehandlung implementiert ist.
class java.awt. Frame
extends Window
implements MenuContainer
|
|
Frame()
Erzeugt ein neues Frame-Objekt, das am Anfang unsichtbar ist. |
|
Frame( String title )
Erzeugt ein neues Frame-Objekt mit einem Fenster-Titel, das am Anfang unsichtbar ist. |
14.3.2 Swing-Fenster darstellen
 
Ein Fenster unter Swing unterscheidet sich vom Ansatz her nicht vom AWT-Pedant; die Klasse heißt JFrame statt Frame
Listing 14.3
HelloSwingFrame.java
import _saito_fett_ javax.swing.JFrame _saito_fettout_ ;
public class HelloSwingFrame
{
public static void main( String[] args )
{
JFrame f = new JFrame ( "Das Fenster zur Welt" );
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
f.setSize( 300, 200 );
f.setVisible( true ); }
}
 Hier klicken, um das Bild zu Vergrößern
Abbildung 14.1
Das erste Swing-Fenster
Die Funktion setDefaultCloseOperation() mit dem Argument JFrame.EXIT_ON_CLOSE beendet die Applikation, wenn der Benutzer das Fenster schließt. Das AWT-Fenster bietet eine ähnliche Funktion nicht an; hier muss per Hand das Fenster geschlossen und die Applikation beendet werden.
So wie der java.awt.Frame besitzt der javax.swing.JFrame neben dem parametrisierten Konstruktor einen Standard-Konstruktor.
class javax.swing. JFrame
extends Frame
implements WindowConstants, Accessible, RootPaneContainer
|
|
JFrame()
Erzeugt ein neues JFrame-Objekt, das am Anfang unsichtbar ist. |
|
JFrame( String title )
Erzeugt ein neues JFrame-Objekt mit einem Fenster-Titel, das am Anfang unsichtbar ist. |
Der Titel eines AWT- und Swing-Fensters lässt sich später mit setTitle() wieder ändern.
14.3.3 Sichtbarkeit des Fensters
 
Nach der Konstruktion ist das Fenster vorbereitet, aber vor dem Aufruf von setVisible(true) noch nicht sichtbar. Weil sich die Frame-Klasse direkt von Window – ein Frame ist ein Window mit Titelleiste – und JFrame von Frame ableitet, besitzen Frame und auch JFrame keine eigene setVisible()-Funktion, sondern erben sie von Component, wovon indirekt auch Window abgeleitet ist.
abstract class java.awt. Component
implements ImageObserver, MenuContainer, Serializable
|
|
void setVisible( boolean b )
setVisible(true) zeigt das Fenster an. Liegt es im Hintergrund, wird es wieder in den Vordergrund geholt. Früher wurde die Methode show() verwendet. |
Weitere Funktionen, die für JFrame und Frame interessant sind, stammen von der Oberklasse Window:
class java.awt. Window
extends Container
implements Accessible
|
|
boolean isShowing()
true, wenn sich das Fenster auf dem Bildschirm befindet. |
|
void toBack()
Das Fenster wird als hinterstes in die Fensterreihenfolge eingereiht. Ein anderes Fenster wird somit sichtbar. |
|
void toFront()
Platziert das Fenster als vorderstes in der Darstellung aller Fenster auf dem Schirm. |
14.3.4 Größe und Position des Fensters verändern
 
Die aus Component geerbte Methode setSize() verändert die Maße des Fensters.
abstract class java.awt. Component
implements ImageObserver, MenuContainer, Serializable
|
|
void setSize( int width, int height )
Verändert die Größe einer Komponente; ehemals size(). |
|
void setSize( Dimension d )
Verändert die Größe einer Komponente; entspricht setSize(d.width, d.height). |
Beispiel Die Position des Fensters f kann mit setLocation() geändert werden. Wer das Fenster zum Beispiel in der Mitte des Bildschirms positionieren möchte, muss vorher die Größe des Bildschirms erfragen. Dies funktioniert mit getScreenSize(), einer Funktion des Toolkits.
Dimension d = Toolkit.getDefaultToolkit(). getScreenSize() ;
f. setLocation ( (d.width – getSize().width ) / 2,
(d.height- getSize().height) / 2 );
|
Wurde vor der Anzeige mit setVisible(true) die Java-5-Funktion setLocation-ByPlatform(true) von einem java.awt.Window aufgerufen, wählt der Fenster-Manager automatisch eine gute Position, und setLocation() ist nicht mehr nötig. Mit isLocationByPlatform() lässt sich später erfragen, wer die Position gesetzt hat; die Rückgabe ist true, wenn es das Fenstersystem war, und false, wenn wir mit setLocation() an der Position herumgespielt haben.
abstract class java.awt. Component
implements ImageObserver, MenuContainer, Serializable
|
|
void setLocation( int x, int y )
Setzt die Komponente an die Position x, y; ehemals move(). |
|
void setLocation( Point p )
Setzt die Komponente an die gewünschte Position. |
|
Point getLocation()
Liefert die Position der Komponente als Point-Objekt. |
Beispiel Auch das Vergrößern eines Fensters f, sodass es die maximale Ausdehnung annimmt, ist mit einer Funktion möglich. Betrachten wir die folgenden Zeilen, die hinter eine setVisible(true)-Methode zum Beispiel im Konstruktor gesetzt werden:
|
f.setLocation( 0, 0 );
f.resize ( Toolkit.getDefaultToolkit().getScreenSize() );
Soll der Frame nicht in der Größe veränderbar sein, so setzen wir einfach
setResizable(false).
Frame frame = new Frame( "Du kriegst mich nicht klein." );
frame. setResizable( false ) ;
|
14.3.5 Hauptprogramm von Frame/JFrame ableiten
 
Wir können unsere neue Klasse auch direkt von Frame bzw. JFrame ableiten. Dann ist es uns gestattet, die Funktionen der Klassen direkt aufzurufen, zum Beispiel setSize(). Im Hauptprogramm erzeugen wir über den eigenen Konstruktor dann das Fenster, denn der eigene Konstruktor ruft ja über die super()-Funktion automatisch den Konstruktor der Oberklasse, also von Frame bzw. JFrame auf.
Listing 14.4
SubWin.java
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
public class SubWin extends JFrame
{
public SubWin( int x, int y )
{
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
setVisible( true );
setSize( x, y );
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
setLocation( (d.width – getSize().width ) / 2,
(d.height – getSize().height) / 2 );
}
public static void main( String[] args )
{
JFrame win = new SubWin( 200, 100 );
}
}
Das Programm erzeugt ein Exemplar von SubWin, das wiederum ein JFrame ist. Wird ein SubWin erzeugt, wird der Konstruktor, der das Fenster auf die im Konstruktor übergebene Größe mittig auf die Benuteroberfläche setzt, abgearbeitet. Das Fenster wird automatisch angezeigt.
14.3.6 Fenster- und Dialog-Dekoration
 
Für bestimmte Anwendungen ist es günstig, bei Fenstern und Dialogen die Standarddialogelemente auszuschalten, etwa dann, wenn der Benutzer das Fenster nicht verkleinern soll. Seit dem SDK 1.4 haben die Entwickler den Klassen Frame und Dialog eine Methode setUndecorated() mitgegeben, über die sich die Titelleiste, das Systemmenü und der Rahmen abschalten lassen. Da Swing auf den AWT-Komponenten basiert, gilt das auch für Swing-Fenster und Swing-Dialoge.
class java.awt. Frame extends Window implements MenuContainer
class java.awt. Dialog extends Window
|
|
void setUndecorated( boolean undecorated )
Setzt/löscht die Dekoration. |
|
boolean isUndecorated()
Erfragt die Dekoration. |
|