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, denn abhängig von der Wahl ist das Verfahren zum Zeichen etwas anders.
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 existiert ein weiterer, 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, welches am Anfang unsichtbar ist. |
|
Frame( String title )
Erzeugt ein neues Frame-Objekt mit einem Fenster-Titel, welches am Anfang unsichtbar ist. |
14.3.2 Swing-Fenster darstellen
 
Ein Fenster unter Swing unterscheidet sich vom Ansatz nicht vom AWT-Pedant; die Klasse heißt JFrame statt Frame
Listing 14.3
HelloSwingFrame.java
import javax.swing.JFrame;
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
Abbildung : Das erste Swing-Fenster
Die praktische Funktion setDefaultCloseOperation() mit dem Argument JFrame.EXIT_ON_CLOSE beendet die Applikation, wenn der Benutzer das Fenster schließt. Das AWT bietet eine ähnliche Funktion nicht an.
Ebenso wie der java.awt.Frame besitzt der javax.swing.JFrame neben dem parametrisierten Konstruktor einen Standard-Konstuktor.
class javax.swing. JFrame
extends Frame
implements WindowConstants, Accessible, RootPaneContainer
|
|
JFrame()
Erzeugt ein neues JFrame-Objekt, welches am Anfang unsichtbar ist. |
|
JFrame( String title )
Erzeugt ein neues JFrame-Objekt mit einem Fenster-Titel, welches 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 noch nicht sichtbar. Es wird erst nach dem Aufruf von setVisible(true) sichtbar. Da sich die Frame-Klasse direkt von Window ableitet – ein Frame ist ein Window mit Titelleiste – und JFrame von Frame, besitzt Frame und auch JFrame keine eigene setVisible()-Funktion, sondern erben sie von Component, wovon indirekt auch Window wieder 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, so 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
 
Mit der aus Component geerbten Methode setSize() können wir die Maße des Fensters verändern.
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 nur 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 );
|
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, so dass 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[] )
{
SubWin win = new SubWin( 200, 100 );
}
}
Das Programm erzeugt ein Exemplar von SubWin, das wiederum ein JFrame ist. Wird ein SubWin erzeugt, wird der Kostruktor abgearbeitet, der das Fenster auf die im Konstruktor übergebene Größe mittig auf die Benuteroberfläche setzt. 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 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. |
|