Java und Swing
Willemers Informatik-Ecke
Java Grafikprogrammierung

Swing ist der zweite Anlauf für eine grafische Oberfläche für Java. Da Java portabel ist, laufen auch Swing-Anwendungen auf jeder Plattform, die eine Laufzeitumgebung (JRE) für Java hat.

Zwar erklärte Oracle, dass Swing durch Java FX abgelöst wird. Ob dies allerdings gelingt, ist noch nicht sicher. Der Charme von Swing ist, dass dessen API besonders einfach zu verstehen ist und damit ein guter Ausgangspunkt für alle, die den Umgang mit grafischen Oberflächen lernen wollen.

Module für Swing

Seit Java 9 wird die Laufzeitumgebung in Module gegliedert. Ziel ist es, dass der Start von Java-Programmen nicht haufenweise Bibliotheken lädt, die es später nie benötigt.

Dazu muss ein Projekt anmelden, welche Module benötigt werden. Dazu liegt dem Projekt die Datei \datei{module-info.java} bei.

Für Swing-Programme muss das Modul \ident{java.desktop} angefordert werden. \begin{verbatim} module MeinProjektName { requires java.desktop; } \end{verbatim} Hinter dem Schlüsselwort module muss der Name des Projekts genannt werden.

JFrame

Das Swing-Programm benötigt zunächst einen Rahmen, also ein Fenster. Die Klasse JFrame stellt ein solches Fenster zur Verfügung.

Erzeugen eines Fensters

import javax.swing.JFrame;

public class MeinSwing {
    public static void main(String[] args) {
        JFrame fenster = new JFrame("Kleines Fenster"); 
        fenster.setSize(400, 300);
        fenster.setVisible(true);
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

JFrame erweitern

Niemand hat Spaß an einem leeren, grauen Fenster ohne Inhalt. Langfristig soll sich das auch ändern. Wenn das Programm einen eigene Version von JFrame erzeugen will, ist es der bessere Weg, JFrame beispielsweise zu MeinFrame zu erweitern. Das Sichtbarmachen und die anderen Aktivitäten verlagern wir in den Konstruktor von MeinFrame. Das Hauptprogramm wird so sehr schlank.
public class ErsterSwing {
    public static void main(String[] args) {
        MeinFrame fenster = new MeinFrame();
    }
}
Genau genommen könnte man die eine Zeile sogar soweit reduzieren, dass nur noch new MeinFrame(); dasteht, da die Referenz gar nicht benötigt wird.

Schauen wir uns MeinFrame an. Die bisherigen Methodenaufrufe über fenster erfolgen nun über this, da MeinFrame ja eine erweiterte Form von JFrame ist.

import javax.swing.JFrame;

public class MeinFrame extends JFrame {
    public MeinFrame() {
        this.setSize(400, 300);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
Prinzipiell können Sie die Methode main auch in die Klasse MeinFrame übernehmen, da jede Klasse eine main-Methode enthalten kann. Dann können Sie die Klasse MeinFrame direkt starten und benötigen die Klasse ErsterSwing nicht mehr.
import javax.swing.JFrame;

public class MeinFrame extends JFrame {
    public MeinFrame() {
        this.setSize(400, 300);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    public static void main(String[] args) {
        new MeinFrame();
    }
}

Methoden

setSize(int a, int b)
setzt Breite und Höhe
setLocation(int a, int b)
setzt Position auf a, Höhe auf b
setTitle(String s)
setzt s als Fensterüberschrift in den Verschiebebalken
setVisible(boolean b)
macht den JFrame sichtbar oder unsichtbar
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
führt zum Beenden der Anwendung, wenn das Schließkreuz angeklickt wird.

Weiterführende Themen


Java Grafikprogrammierung