Java Anwendungsentwicklung – Tag 5 von 10 🔴 KOPFNUSS
Von Franz-Martin, CTO bei Java Fleet Systems Consulting

Schwierigkeit: 🔴 Fortgeschritten
Voraussetzungen: Tag 1-4 abgeschlossen


🗺️ Deine Position im Kurs

TagThemaNiveauStatus
1Die Desktop-Ära: Warum GUIs?🟢 Grundlagen✅ Abgeschlossen
2AWT & Swing Grundlagen🟢 Grundlagen✅ Abgeschlossen
3Layouts & Event-Handling🟢 Grundlagen✅ Abgeschlossen
4Komplexe Swing-Komponenten🟡 Fortgeschritten✅ Abgeschlossen
→ 5JavaFX: Die „moderne“ Alternative🔴 KOPFNUSS👉 DU BIST HIER!
6JDBC Grundlagen🟢 Grundlagen🔜 Kommt als nächstes
7JDBC Best Practices🟡 Fortgeschritten🔒 Gesperrt
8JPA Einführung🟢 Grundlagen🔒 Gesperrt
9JPA CRUD & Queries🟡 Fortgeschritten🔒 Gesperrt
10Integration & Ausblick🔴 KOPFNUSS🔒 Gesperrt

Legende: 🟢 Einsteiger-freundlich | 🟡 Erfordert Grundlagen | 🔴 Optional/Anspruchsvoll


⚠️ KOPFNUSS-WARNUNG

Dieser Tag ist als KOPFNUSS markiert!

Das bedeutet: JavaFX ist optional für den Kursabschluss. Du MUSST es nicht beherrschen.

Warum trotzdem lernen?

  • Du verstehst, warum Java Desktop „verloren“ hat
  • Die Konzepte (Properties, Binding, CSS) sind in modernen Frameworks überall
  • Manchmal taucht JavaFX in Legacy-Projekten auf

⚡ Das Wichtigste in 30 Sekunden

JavaFX sollte Swing ablösen. Hat es nicht.

Was JavaFX besser macht:

  • ✅ CSS-Styling
  • ✅ Property Binding (wie React State!)
  • ✅ FXML für Layout (wie HTML)
  • ✅ Moderne Grafik-Engine

Warum es trotzdem verloren hat:

  • ❌ Kam 2007 raus – gleiches Jahr wie das iPhone
  • ❌ Web-Apps wurden zur Norm
  • ❌ Oracle hat es 2018 aus dem JDK entfernt
  • ❌ Kleinere Community als Swing

Fazit: Lern die Konzepte, nicht die Details. Die Ideen findest du in React, Vue, Flutter wieder.


🟢 GRUNDLAGEN

Swing vs JavaFX – Der Vergleich

JavaFX

Abbildung 1: Die fundamentalen Unterschiede


AspektSwingJavaFX
StylingJava-Code, Look-and-FeelCSS!
LayoutLayoutManagerFXML (XML) oder Code
EventsListener + LambdaProperty Binding
GrafikJava2D, AWTHardware-beschleunigt
Im JDK✅ Ja (seit 1.2)❌ Nein (seit JDK 11)

Setup: JavaFX zum Projekt hinzufügen

Seit JDK 11 ist JavaFX NICHT mehr im JDK enthalten!

<!-- pom.xml -->
<dependencies>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>21</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>21</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>0.0.8</version>
            <configuration>
                <mainClass>de.javafleet.fx.HalloJavaFX</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

Hallo JavaFX

public class HalloJavaFX extends Application {
    
    @Override
    public void start(Stage primaryStage) {
        // Label erstellen
        Label label = new Label("Hallo JavaFX!");
        label.setStyle("-fx-font-size: 24px; -fx-text-fill: #66BB6A;");
        
        // Button
        Button button = new Button("Klick mich!");
        button.setOnAction(e -> label.setText("Geklickt!"));
        
        // Layout
        VBox root = new VBox(20, label, button);
        root.setAlignment(Pos.CENTER);
        root.setStyle("-fx-background-color: #1a1a2e; -fx-padding: 40;");
        
        // Scene und Stage
        Scene scene = new Scene(root, 400, 300);
        primaryStage.setTitle("Hallo JavaFX!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    
    public static void main(String[] args) {
        launch(args);  // Startet JavaFX Application Thread
    }
}

Die wichtigsten Unterschiede zu Swing:

  • Application statt JFrame erweitern
  • Stage ist das Fenster, Scene der Inhalt
  • launch(args) statt SwingUtilities.invokeLater()
  • CSS direkt mit setStyle() oder externe Dateien

🟡 PROFESSIONALS: Property Binding

Das Killer-Feature von JavaFX

Abbildung 2: Property Binding – Automatische Synchronisation


In Swing musst du manuell synchronisieren:

// Swing - MANUELL
slider.addChangeListener(e -> {
    label.setText("Wert: " + slider.getValue());
});

In JavaFX passiert das AUTOMATISCH:

// JavaFX - AUTOMATISCH
Slider slider = new Slider(0, 100, 50);
Label label = new Label();

// Binding: Label zeigt IMMER den Slider-Wert!
label.textProperty().bind(
    slider.valueProperty().asString("Wert: %.0f")
);

Das ist das gleiche Konzept wie:

  • React: useState + automatisches Re-Rendering
  • Vue: ref() + Reaktivität
  • Angular: Two-Way Binding

Bidirektionales Binding

TextField field1 = new TextField();
TextField field2 = new TextField();

// Was in field1 eingegeben wird, erscheint in field2 und umgekehrt!
field1.textProperty().bindBidirectional(field2.textProperty());

🟡 CSS-Styling

Inline-Styles

button.setStyle(
    "-fx-background-color: #42A5F5;" +
    "-fx-text-fill: white;" +
    "-fx-font-size: 14px;" +
    "-fx-padding: 10 20;"
);

Externe CSS-Datei

/* styles.css */
.button {
    -fx-background-color: #42A5F5;
    -fx-text-fill: white;
}

.button:hover {
    -fx-background-color: #1E88E5;
}

.label-title {
    -fx-font-size: 24px;
    -fx-font-weight: bold;
}
// CSS laden
scene.getStylesheets().add(
    getClass().getResource("/styles.css").toExternalForm()
);

// Style-Klasse zuweisen
label.getStyleClass().add("label-title");

Wichtig: JavaFX-CSS ist NICHT Standard-CSS! Alle Properties beginnen mit -fx-.


🔵 BONUS: FXML

FXML trennt Layout (XML) von Logik (Java) – wie HTML + JavaScript:

<!-- view.fxml -->
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.*?>

<VBox xmlns:fx="http://javafx.com/fxml" 
      fx:controller="de.javafleet.fx.Controller"
      spacing="20" alignment="CENTER">
    
    <Label fx:id="label" text="Hallo FXML!"/>
    <Button text="Klick!" onAction="#handleClick"/>
    
</VBox>
// Controller.java
public class Controller {
    @FXML private Label label;
    
    @FXML
    private void handleClick(ActionEvent event) {
        label.setText("Geklickt!");
    }
}

💬 Real Talk: Warum JavaFX nie gewonnen hat

Franz-Martin lehnt sich zurück…


Nova: „JavaFX klingt eigentlich besser als Swing. Warum hat es sich nicht durchgesetzt?“

Franz-Martin: „Timing. JavaFX kam 2007 raus. Weißt du, was noch 2007 rauskam?“

Nova: „…das iPhone?“

Franz-Martin: „Exakt. Und 2008 kam Chrome. Plötzlich war klar: Die Zukunft ist Web und Mobile, nicht Desktop.“

Nova: „Aber JavaFX war doch moderner…“

Franz-Martin: „War es. CSS-Styling, Property Binding – alles Konzepte, die heute in React und Vue Standard sind. Aber es war zu spät. Unternehmen hatten bereits Swing-Apps. Warum migrieren, wenn das Web die Zukunft ist?“

Nova: „Also war JavaFX die Lösung für ein Problem, das nicht mehr existierte?“

Franz-Martin: „So ungefähr. Und dann hat Oracle 2018 JavaFX aus dem JDK entfernt. Das war das Signal: ‚Selbst Oracle glaubt nicht mehr daran.'“

Nova: „Sollte ich es trotzdem lernen?“

Franz-Martin: „Die KONZEPTE – ja. Property Binding, Reactive Programming, CSS für UI – das findest du überall. Aber investier nicht Wochen in JavaFX-Details. Lern lieber React oder Vue.“

Nova: „Also ist dieser Tag…“

Franz-Martin: „…eine Geschichtsstunde mit praktischem Nutzen. Du verstehst, woher moderne UI-Konzepte kommen. Und manchmal stolperst du in Legacy-Projekten über JavaFX.“


✅ Checkpoint

📝 Quiz

Frage 1: Was ist der Hauptunterschied zwischen Swing und JavaFX?

A) JavaFX ist schneller
B) JavaFX nutzt CSS für Styling und Properties für Binding
C) Swing ist moderner
D) Es gibt keinen wesentlichen Unterschied


Frage 2: Warum ist JavaFX seit JDK 11 nicht mehr im Standard-JDK?

A) Es war zu buggy
B) Oracle hat die Entwicklung eingestellt und es als separates Projekt ausgelagert
C) Es wurde durch Swing ersetzt
D) Es ist jetzt in JavaEE


Frage 3: Was macht label.textProperty().bind(slider.valueProperty())?

A) Kopiert einmalig den Wert
B) Der Label-Text wird AUTOMATISCH aktualisiert wenn sich der Slider ändert
C) Der Slider wird vom Label gesteuert
D) Nichts, das ist keine gültige Syntax


📝 Quiz-Lösungen

Frage 1:B – JavaFX nutzt CSS für Styling und Properties für Binding

Frage 2:B – Oracle hat die Entwicklung an OpenJFX übergeben

Frage 3:B – Der Label-Text wird AUTOMATISCH aktualisiert (das ist Property Binding!)


📦 Downloads

ProjektInhaltDownload
java-anwendungsentwicklung-tag5.zipJavaFX-Demos⬇️ Download

Quick Start:

mvn javafx:run                    # Hallo JavaFX
mvn javafx:run -Pbinding          # Property Binding Demo  
mvn javafx:run -Pcss              # CSS Styling Demo

🎉 Tag 5 (KOPFNUSS) geschafft!

Was du heute gelernt hast:

✅ JavaFX Setup (Maven, OpenJFX)
✅ Grundstruktur (Application, Stage, Scene)
✅ Property Binding – das Killer-Feature
✅ CSS-Styling in JavaFX
✅ Warum JavaFX historisch „verloren“ hat
✅ Konzepte, die du in React/Vue wiederfindest

Morgen – Tag 6: JDBC Grundlagen

Wir verlassen die GUI-Welt und tauchen in Datenbanken ein!


Fragen? franz-martin@java-developer.online

© 2025 Java Fleet Systems Consulting | java-developer.online

Autor

  • Franz-Martin

    65 Jahre alt, CTO und Gründer von Java Fleet Systems Consulting. Franz-Martin ist erfahrener Java-Entwickler, Tutor und Dozent, der das Unternehmen gegründet hat, um sein Wissen weiterzugeben und echte Java-Probleme zu lösen. Er moderiert Team-Diskussionen, mentoriert alle Crew-Mitglieder und sorgt dafür, dass technische Exzellenz mit Business-Realität kombiniert wird.