Java Standard: Grafische Oberflächen mit Swing: Top Level Container: javax swing JFrame


 
JFrame mit JButton unter Linux/KDE

Ein JFrame ist als Äquivalent zum java.awt.Frame die Darstellung eines grafischen leichtgewichtigen Fensters. Er hat im Gegensatz zum Dialog grds. eine Titelzeile, ein Minimieren-, Maximieren- und Schließenicon. Zudem besitzt ein Fenster üblicherweise ein Anwendungsicon und ein Systemmenü.

Seit Java 1.4 ist es zudem möglich die grundsätzichen Eigenschaften (siehe oben) mit Hilfe der Methode setUndecorated (true) zu entfernen. Hierbei wird dann auch der Rahmen (Border) mit entfernt.

Die Klasse JFrame ist als Top-Level-Container für grafische Benutzeroberflächen von Applikationen gedacht, die eigenständig auf einem Rechner laufen sollen.

JFrame erzeugen

Bearbeiten

Um einen JFrame zu erzeugen, muss man nur den entsprechenden Konstruktor aufrufen.

// Erzeugt einen JFrame ohne Titel
JFrame frame = new JFrame();

// Erzeugt einen JFrame mit Titel
JFrame frame = new JFrame( "Hallo Welt" );

Man sollte einen JFrame nie ohne Titel belassen, allerdings kann es ja erforderlich sein, den Titel erst nach einer Initialisierung zu setzen

JFrame frame = new JFrame();

frame.setTitle( "Hallo Welt" );

Das funktioniert natürlich auch, nachdem der JFrame bereits sichtbar gemacht wurde. Die Methode setTitle( String title ) löst automatisch ein "Neuzeichnen" des Frames aus.

JFrame sichtbar machen

Bearbeiten

Um einen JFrame sichtbar zu machen, muss man die Methode setVisible( boolean visible ) aufrufen, die ein erstmaliges Zeichnen des JFrames auslöst. Tut man dies nicht, bleibt der JFrame ungezeichnet und man sieht nichts, obwohl das Programm abläuft.

JFrame f = new JFrame( "Hallo Welt" );
// Macht einen JFrame sichtbar
f.setVisible(true);

Wird diese Methode nicht aufgerufen, werden auch die Methoden setSize() oder setTitle() kein Zeichnen des JFrames auslösen. Sie können den JFrame praktisch nur dann am Bildschirm Neuzeichnen, wenn das Attribut Sichtbarkeit auf wahr gesetzt wurde.

Man bemerkt, dass der Frame nur als kleines Fenster ohne eine bestimmte Größe links oben am Bildschirmrand angezeigt wird. Um dies zu ändern, muss man die Größe des JFrames festlegen.

// Legt die Größe des Fensters in Pixeln fest
// Und löst ein Neuzeichnen des JFrames aus
frame.setSize( 200, 300 );

Verhalten festlegen

Bearbeiten

Wenn man einen JFrame erzeugt, erhält dieser von Haus aus einen gewissen Grad an "Benehmen":

Er schließt sich augenscheinlich, wenn man wie gewohnt das Schließen-Symbol anklickt. Das bedeutet jedoch nicht, das damit die main-Methode beendet wird. Das kann man gut erkennen, wenn man eine Applikation mit einem JFrame von der Kommandozeile aus mittels "java Klassenname" startet. Auch nachdem man den Frame geschlossen hat, erscheint nicht die den Stop des Programms anzeigende Zeile mit dem Pfad, in dem man sich befindet. Er vergrößert sich automatisch auf die Bildschirmgöße, wenn man auf das entsprechende Maximieren-Symbol klickt. Er minimiert sich automatisch, wenn man auf das entsprechende Minimieren-Symbol klickt. Dieses Verhalten ist Standard und wird dem JFrame nicht ohne Grund mitgegeben. Wenn man einen JFrame die Applikation terminieren lässt, kann man hinterher schlecht noch irgendwelche anderen Aktionen, wie das Sichern von Daten ausführen. Um zu erreichen, dass eine Applikation terminiert, wenn man auf das Schließen-Symbol klickt, muss man die Methode setDefaultCloseOperation( int closeOperation ) aufrufen.

JFrame frame = new JFrame( "Hallo Welt" );

// Standardeinstellung - Das Fenster wird geschlossen, aber die Applikation nicht terminiert.
frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );

// Verhalten, das sich für kleinere Applikationen eignet. Frame terminiert auch die Anwendung.
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

Beispiel

Bearbeiten

Beispiel mit JFrame und JButton (benutzt die AWT-Komponente ActionListener):

import javax.swing.*;
import java.awt.event.*;

public class TestJFrame extends JFrame 
{
    JButton testJButton = new JButton("Schaltfläche");
    public TestJFrame() 
    {
	initComponents();	  
    }
	  
    private void initComponents()
    {
        setTitle("Ein reines, unbeflecktes Frame");  // Fenstertitel setzen
	testJButton.addActionListener(new TestActionListener()); // EventListener für Schaltfläche hinzufügen
        add(testJButton);                                        // Schaltfläche zum Fenster hinzufügen         
	pack();
	setSize(200,200);                            // Fenstergröße einstellen
                                                     // (notwendig, damit das Fenster geschlossen werden kann)
	setVisible(true);                            // Fenster (inkl. Inhalt) sichtbar machen
    }
	  
    class TestActionListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e) 
        {
            System.out.println("Schaltfläche wurde gedrückt");
        }           
    }
	  
	/**
	 * @param args
	 */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TestJFrame();
            }
        }); // Erzeugt einen neuen Thread, der eine Instanz von TestJFrame erzeugt
    }
}