Getty Images

Swing versus JavaFX: Vergleich der GUI-Frameworks für Java

Swing wird seit 1998 mit Java-GUIs verwendet. Es gibt jedoch gute Gründe, stattdessen JavaFX zu verwenden. Welches Framework Sie für Ihr nächstes Java-Projekt wählen sollten.

Der Hauptunterschied zwischen Swing und JavaFX besteht darin, dass JavaFX ein aktiv gepflegtes Java-Projekt ist, das die Entwicklung moderner, funktionsreicher GUI-Anwendungen unterstützt, während Swing ein älteres Framework für die Entwicklung von Desktop-Apps ist, das derzeit keine neuen Funktionen mehr erhält und für neue Projekte nicht empfohlen wird.

Desktop-Entwicklung in Java

Ja, Entwickler können Java zur Entwicklung grafischer Benutzeroberflächen (Graphic User Interface, GUI) verwenden. Tatsächlich war die Fähigkeit von Java, plattformübergreifende Desktop-Apps zu erstellen, eines der größten Verkaufsargumente der Sprache, als sie 1995 auf den Markt kam.

Im Laufe der Jahre hat sich jedoch nicht nur Java weiterentwickelt und verändert, sondern auch die unterstützten Desktop-Rendering-Toolkits. Das ursprüngliche Abstract Window Toolkit (AWT) wurde durch Swing-Komponenten ersetzt, die nun wiederum durch JavaFX abgelöst wurden, die bevorzugte Wahl für die moderne Entwicklung.

5 Gründe, JavaFX anstelle von Swing zu wählen

Obwohl Swing und AWT beide eine wichtige Rolle in der Geschichte der GUI-Entwicklung spielten, sind die Funktionslisten beider Projekte eingefroren und die einzige aktive Weiterentwicklung betrifft Patches und Fehlerbehebungen. Im Gegensatz dazu wird JavaFX aktiv gepflegt und bietet eine Vielzahl moderner Funktionen, die Swing und AWT einfach nicht unterstützen, darunter die folgenden:

  1. eine moderne Grafik-Engine
  2. Unterstützung für moderne Webtechnologien wie CSS
  3. FXML-Unterstützung für Vorlagen und Seitendesign
  4. Szenengraph-Architektur
  5. Multimedia- und Web-Integration

Moderne Grafik-Engine

JavaFX verwendet eine Rendering-Pipeline als Grafik-Engine, die Prism genannt wird. Sie unterstützt hardwarebeschleunigte Grafiken je nach Plattform, auf der sie ausgeführt wird, einschließlich OpenGL für macOS und Linux oder Direct3D für Windows. Für Fälle, in denen keine Hardwarebeschleunigung verfügbar ist, steht ein Software-Rendering auf der Grundlage von CPU-Rendering-Techniken zur Verfügung. Dies bietet in fast allen Fällen eine überlegene Leistung und flüssige Animationen.

CSS-Styling

Im Gegensatz zu Swing können Sie CSS verwenden, um Ihre JavaFX-Schnittstellen zu gestalten. Dadurch lässt sich das Standard-Look-and-Feel sehr einfach anpassen, um es beispielsweise an Ihre Corporate Identity anzugleichen. Bibliotheken wie AtlantaFX und JMetro fügen einer Anwendung Themes hinzu, um das Design über alle Komponenten hinweg einheitlich anzupassen.

FXML-Unterstützung

Wenn Entwickler eine Benutzeroberfläche mit JavaFX erstellen, können sie zwei verschiedene Ansätze verfolgen:

  • Nur Code. Alle Komponenten werden mit Code erstellt und einer Layoutkomponente hinzugefügt.
  • FXML. Das Layout wird in einer XML-basierten Datei mit Bindungen an den zu bearbeitenden Code erstellt, zum Beispiel für das Drücken von Schaltflächen.

Der FXML-Ansatz führt zu einer klareren Trennung zwischen dem Design der Benutzeroberfläche und der Anwendungslogik. Scene Builder ist ein WYSIWYG-Editor, der Entwicklern bei der Erstellung solcher FXML-Dateien hilft. Dieser Ansatz ist besonders praktisch für Entwicklungsteams, in denen verschiedene Personen das Layout und die Logik erstellen.

Benutzeroberfläche in Scene Builder
Abbildung 1: Eine Benutzeroberfläche, die in Scene Builder erstellt wird, mit einer baumartigen hierarchischen Struktur und Verknüpfungen zu Code, wie zum Beispiel das Drücken einer Taste.

Szenengraph-Architektur

Jedes visuelle Element in JavaFX geht von einem Knoten aus und wird in einer baumartigen hierarchischen Struktur dargestellt. Ein Element kann entweder ein Container (zum Beispiel Group, Pane und HBox) oder eine einzelne Komponente (zum Beispiel Schaltfläche und Beschriftung) sein, wobei die Szene der Container der obersten Ebene ist. Bei Verwendung dieser Baumstruktur wird eine auf das übergeordnete Element angewendete Transformation oder ein Effekt auch auf alle untergeordneten Elemente angewendet. Durch diesen Ansatz wird die Rendering-Pipeline optimiert und die Grafik hardwarebeschleunigt.

Multimedia- und Web-Integration

Das JavaFX-Framework enthält Komponenten mit integrierter Unterstützung für Webansichten, Medienwiedergabe und 3D-Grafiken. Mit diesen können Entwickler weit über das hinausgehen, was mit herkömmlichen UI-Frameworks wie Swing und AWT möglich war.

Die Rolle von Swing und Java AWT

AWT war die erste Bibliothek, die die GUI-Entwicklung in Java unterstützte, und war Teil der ursprünglichen JDK-Version von 1995.

Obwohl AWT funktional und benutzerfreundlich war, hatte es auch seine Nachteile. Komponenten wurden langsam gerendert, es gab eine enttäuschend begrenzte Anzahl vorgefertigter Komponenten und die bereitgestellten Komponenten ließen sich nicht einfach erweitern. Um diesen Nachteilen Rechnung zu tragen, wurden die Swing-Komponenten und die Java Foundation Classes (JFC), die sie unterstützen, der JDK 1.2-Version von 1998 hinzugefügt.

Die Swing-Komponenten und das von Swing bereitgestellte Framework für die GUI-basierte Entwicklung in Java wurden von der Community gut angenommen, die die Technologie zur Entwicklung einer Vielzahl von Desktop-Anwendungen für Unternehmen nutzte, darunter die beliebte IDE IntelliJ IDEA.

Eine minimale Swing-Anwendung sieht wie folgt aus:

import javax.swing.*;

/**
 * You can execute this example with java:
 * $ java HelloWorldSwing.java
 */
public class HelloWorldSwing {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Hello Swing World!");
        frame.setSize(300, 200);

        // Create a label with the hello world message
        JLabel label = new JLabel("This is a label", SwingConstants.CENTER);
        frame.add(label);

        // Make the frame visible
        frame.setVisible(true);
    }
}

Die Zukunft von Swing und AWT

Um die Abwärtskompatibilität mit Projekten, die sie verwenden, zu gewährleisten, werden sowohl Swing als auch die älteren AWT-Komponenten weiterhin mit modernen Versionen des JDK ausgeliefert. Allerdings wird keines der beiden Projekte aktiv gepflegt. Swing befindet sich nun im Maintenance Mode, in dem es nur Fehlerbehebungen und Sicherheits-Updates, aber keine neuen Funktionen erhält.

Als im Juni 2012 das Update 6 von Java SE 7 veröffentlicht wurde, machte Oracle deutlich, dass JavaFX Swing als Standard-UI-Bibliothek für Java ersetzen würde.

Was ist JavaFX?

JavaFX hat einen etwas verschlungenen Weg hinter sich.

Es wurde erstmals 2008 unter dem Namen JavaFX Script veröffentlicht und konzentrierte sich auf Desktop-Anwendungen und Webbrowser. Ursprünglich war es als Skriptsprache konzipiert, wurde aber mit der Version 2 von 2011 zu einer vollwertigen Java-Bibliothek, die als Teil des JDK vertrieben wurde. Mit der Veröffentlichung von Java 11 im Jahr 2018 wurde JavaFX erneut zu OpenJFX, einem separaten OpenJDK-Projekt auf GitHub.

Das in Java 8 eingeführte Modulsystem umfasste auch JavaFX vollständig. Dies führte zu einer feiner abgestuften Abhängigkeitsstruktur, die es Entwicklern ermöglichte, nur die Teile davon (zum Beispiel Steuerelemente, Grafiken, Web, FXML) zu integrieren, die für eine Anwendung erforderlich waren.

OpenJFX ist nicht mehr Teil von OpenJDK, aber Sie können immer noch JDK-Installationsprogramme erhalten, die sowohl OpenJDK als auch OpenJFX enthalten. Alternativ können Sie OpenJFX einfach in jedes Java-Projekt einbinden, indem Sie das Projekt in einer Maven-POM- oder Gradle-Build-Datei referenzieren.

Diese stetige Weiterentwicklung von JavaFX, jetzt OpenJFX, zeigt, dass es sich um den modernen Ansatz für die GUI-Entwicklung mit Java handelt. Bestehende Swing-Anwendungen, die auf ein neues Layout mit einem aktuellen Ansatz aktualisiert werden müssen, können schrittweise migriert werden, da beide Frameworks nebeneinander existieren können.

JavaFX-Beispiel

Der folgende Code zeigt eine einfache JavaFX-Anwendung, die für die Ausführung mit JBang geschrieben wurde:

///usr/bin/env jbang "$0" "$@" ; exit $?

//DEPS org.openjfx:javafx-controls:23

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 * You can execute this example with jbang.dev, 
 * which will fetch a matching Java runtime if needed:
 * $ jbang HelloWorldJavaFX.java
 */
public class HelloWorldJavaFX extends Application {
    
    @Override
    public void start(Stage primaryStage) {
        StackPane root = new StackPane();

        Label label = new Label("This is a label");
        root.getChildren().add(label);

        Scene scene = new Scene(root, 300, 200);

        primaryStage.setTitle("Hello JavaFX World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Und so sieht der Code aus, wenn er in JBang ausgeführt wird:

JavaFX-Anwendung in JBang
Abbildung 2: Eine nebeneinander angeordnete Hello, World-JavaFX-Anwendung, die mit JBang ausgeführt wird.

Swing oder JavaFX – was ist besser?

Was sollten Sie also für Ihr nächstes Java-Projekt wählen: Java Swing oder JavaFX?

Swing spielte eine wichtige Rolle bei der Weiterentwicklung der GUI-Entwicklung auf der Java-Plattform. Viele ältere Programme verwenden immer noch Swing-Komponenten, was bedeutet, dass das Interesse an den JFC-Klassen, die Swing unterstützen, auch in Zukunft bestehen bleiben wird.

JavaFX stellt jedoch die Zukunft der Entwicklung von Java-Desktop-Benutzeroberflächen dar, da es effektivere, flexiblere und visuell überzeugendere Funktionen bietet.

Vermeiden Sie Swing für alle Greenfield-Projekte, die Java-GUI-Unterstützung erfordern. JavaFX ist die richtige Wahl.

Erfahren Sie mehr über Softwareentwicklung