13.01 Oberflächen in Java

Für den Desktop von Endanwendern gibt es nahezu kein größeres Programm mehr, das ohne eine grafische Benutzeroberfläche auskommt. In diesem Kapitel lernen Sie die drei wichtigsten Bibliotheken um Erzeugen grafischer Oberflächen kennen.

Das Abstract Window Toolkit
Das Abstract Window Toolkit (AWT) ist die älteste, noch benutzte Oberflächen-Bibliothek in Java. AWT verwendet Komponenten des jeweiligen Betriebssystems zum Erstellen der Oberfläche. Deshalb werden diese Komponenten als schwergewichtige Komponenten bezeichnet. Dadurch kann AWT langsamer werden, besonders bim Einsatz von größeren, komplizierten Komonenten. Ein weiterer Nachteil ist, dass aufgrund der Gebundenheit an das jeweilige Betriebssytem nur GUI-Elemente verwendet werden können, die auf allen Betriebssystemen verfügbar sind, auf denen auch Java läuft. Das schließt zum Beispiel Tabellen oder Bäume aus.

Ein minimalistisches Fenster mit AWT

Ein Fenster wird in AWT durch die Klasse Frame aus dem Paket java.awt repräsentiert. Es gibt einen parameterlosen Konstruktor, allerdings wird der Konstruktor Frame(String title) häufiger verwendet. Wie der Name schon sagt, wird durch ihn der Titel des Fensters gleich beim Erzeuen des Fensters gesetzt. Um dieses Fenster sichtbar zu machen, müssen Sie nur noch die Methode setVisible(boolean visisble) aufrufen.
In der oberen linken Ecke sehen Sie dann das Fenster, welches Sie größer ziehen können. Damit das Fenster gleich in einer aktzeptablen Größe erscheint, kann man mit der Methode Frame.setSize(int width, int height) die Anfangsgröße von vorn herein festlegen. Der Code für ein minimalistisches AWT-Programm sieht dann so aus:

package de.jbb.gui_tutorial

import java.awt.Frame;

public class Main{

  public static void main(String[] args){
    
    Frame awtFrame = new Frame("Mein erstes AWT-Fenster");
    awtFrame.setSize(100,100);
    awtFrame.setVisible(true);
  }

}

Das Fenster lässt sich nicht über das „X“ in der Titelleiste schließen, Sie müssen den Prozess also manuell beenden. In den nächsten Kapiteln lernen Sie, wie man ein AWT-Fenster über das „X“ schließen kann.

Swing

Swing ist die am meisten verwendete GUI-Bibliothek für Java. Anders als das AWT bietet Swing leichtgewichtige Komponenten an, dass heißt, Swing ruft keine Systemmethoden zum Zeichnen der GUI-Elemente auf, sondern zeichnet sie komplett selbst. Dadurch sehen Swing-Oberflächen auf allen Betreibsystemen gleich aus. Der daraus resultierende Nachteil ist, dass sich dann Java-Oberflächen nicht immer gut ins jeweilige Betreibsystem einpassen und oft fremd aussehen. Wie man dies umgeht, wird Ihnen in den Folgekapiteln erklärt.

Ein minimalistisches Swing-Programm

Die Swing-Klassen sind in dem Paket javax.swing untergebracht. Die Klasse, die ein Fenster darstellt, heißt JFrame. Auch hier gibt es wieder mehrere Konstruktoren, wobei JFrame(String title) am meisten benutzt wird. Er legt, wie dem Namen schon zu entnehmen ist, den Titel des Fensters fest. Hier nun der gesamte Code zum Anzeigen eines Fensters:

package de.jbb.gui_tutorial

import javax.swing.JFrame;

public class Main{

  public static void main(String[] args){

    JFrame swingFrame = new JFrame("Mein erstes Swing-Fenster");
    swingFrame.setSize(100,100);
    swingFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    swingFrame.setVisible(true);
  }
}

Die Methode setSize(int width, int height) setzt auch hier wieder die Größe des Fensters. JFrame.setDefaultCloseOperation(int operation) legt fest, was getan werden soll, wenn auf das „X“ in der Titelleiste geklickt wurde. In diesem Fall wird das Programm beendet. Neben EXIT_ON_CLOSE stehen auch noch DISPOSE_ON_CLOSE, welches das Fenster löscht, und HIDE_ON_CLOSE, welches das Fenster unsichtbar macht, zur Verfügung. Mit setVisible(boolean true) lässt sich das Fenster dann wieder sichtbar machen.

Das Standard Widget Toolkit

Das Standard Widget Toolkit (SWT) ist eine im Jahre 2001 von IBM entwickelte Bibliothek zum Erstellen von grafischen Oberflächen. Es benutzt, wie das AWT, die nativen Methoden zum Erstellen der Oberfläche. Das SWT wird standardmäßig nicht mit Java ausgeliefert, das heißt, Sie müssen es hier herunterladen, wenn Sie es benutzen wollen.
Das SWT ist nicht plattformunabhängig, es gibt aber Pakete für alle gängigen Betriebssysteme. Daraus folgt, das Ihre Programme ebenfalls nicht mehr plattformunabhängig sind und Sie deshalb auch verschiedene Versionen für verschiedene Betriebsysteme herausgeben müssen oder den User zwingen, das richtige Paket selbst herunter zu laden und in den Classpath einzufügen. Letzeres wird die meisten User aber an den Rand der Verzweiflung bringen.

Ein minimalistisches SWT-Programm

Zunächst müssen Sie das heruntergeladene Jar-Archiv in Ihr Programm einbinden. Lesen Sie hierzu bitte das Kapitel 07.03 Einbinden von externen Klassen – Classpath.
Im SWT ist die Oberflächen-Verwaltung etwas anders gestaltet als bei AWT und Swing. Es gibt die Klasse Display im Paket org.eclipse.swt.widgets. Das Display ist ein Container für alle anderen GUI-Komponenten, pro Applikation gibt es normalerweise nur ein Display-Objekt.
Ein Fenster wird im SWT durch ein Objekt der Klasse Shell aus dem Paket org.eclipse.swt.widgets dargestellt. Im Konstruktor wird das Elternobjekt angegeben und über die Methode setText(String text) kann dann der Titel verändert werden.
Anschließend muss man das Fenster mit der Methode open() sichtbar machen.
Anders als seinen beiden Brüdern muss man sich beim SWT nicht um das Schließen des Fensters kümmern, sondern darum, dass es geöffnet bleibt. Dazu wird in der Regel eine while-Schleife verwendet, die mit Hilfe der Methode Shell.isDisposed() solange durchläuft, bis das Fenster geschlossen wurde. Damit das Fenster mit dem Kreuz in der Titelleiste geschlossen werden kann, muss innerhalb der while-Schleife dieser Klick auf das Kreuz abgefangen werden. Das passiert mit der Methode Display.readAndDispatch(). Sie fängt Events (z. B. Mausbewegung) ab, verarbeitet sie, gibt true zurück, wenn noch mehr Events zu verarbeiten sind, oder false, wenn im Moment kein Event zu verarbeiten ist. Wenn dies der Fall ist, lassen wir das Display mit der Methode sleep() solange schlafen, bis ein neues Event auftritt.
Der Code einer minimalen SWT-Anwendung sieht dann so aus:

package de.jbb.hui_tutorial

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Main {

  public static void main(String[] args) {

    Display display = new Display(); //Erzeugen des GUI-Containers
    Shell shell = new Shell(display); // Erzeugen des Fensters mit Übegabe der Elternkomponente
    shell.setText("Mein erstes SWT-Fenster"); //Setzen des Titels
    shell.open(); // Anzeigen des Fensters
    while(!shell.isDisposed()){ // Warten, bis Fenster geschlossen wird
       if(!display.readAndDispatch()){ // Wenn kein Event zum Verarbeiten da ist, dann lege das Display schlafen
         display.sleep();
       }
    }
  }
}

Ausblick
In diesem Kapitel haben Sie die drei wichtigsten Bibliotheken zum Erstellen von grafischen Oberflächen kennen gelernt und bereits mit jeder Bibliothek ein Fenster dargestellt. In den nächsten Kapiteln werden Sie lernen, wie man „echte“, funktionstüchtige Oberflächen mit den einzelnen Bibiotheken baut.

Previous Article
Next Article

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.