Alle Tabs der Lerneinheit (Erklärung · Interaktiv verstehen · Praxis-Übung · Klausur-Quiz) als durchgehender Text. Ideal zum Wiederholen vor der Klausur, und für Suchmaschinen wie Google, Bing und KI-Suche (ChatGPT, Perplexity).
Erklärung
Bis jetzt liefen deine Programme auf der Konsole. Eine GUI (grafische Oberfläche) hat Fenster, Buttons und Eingabefelder, auf die der Nutzer klickt. JavaFX ist Javas moderner GUI-Werkzeugkasten. Das Denkmodell ist anders als bei Konsolen-Programmen: dein Code baut einen Baum aus Komponenten auf und sagt, was bei einem Ereignis passieren soll (event-getrieben), statt eine feste Abfolge von Anweisungen abzuarbeiten.
Was du können musst:
- den Scene-Graph verstehen: Stage → Scene → root-Knoten → Kinder
- den richtigen Layout-Container wählen (VBox, HBox, GridPane, BorderPane)
- Controls einsetzen (Button, Label, TextField) und einem Container hinzufügen
- Event-Handling mit
setOnActionund einem Lambda
Abgrenzung: hier nur die Grundlagen (Container, Komponenten, Events). FXML, CSS-Styling, Property-Bindings und Animationen sind nicht Teil dieses Topics.
Die Idee in einem Satz
Eine JavaFX-Oberfläche ist ein Baum von Knoten (der Scene-Graph): die Stage ist das Fenster, die Scene ihr Inhalt, darin ein root-Knoten (meist ein Layout-Container) mit beliebig vielen Kind-Komponenten.
Der Scene-Graph
Label label = new Label("Hallo");
VBox root = new VBox(label); // root-Knoten mit einem Kind
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.show();
Stage (Fenster)
└── Scene (Inhalt, 300 x 200)
└── VBox (root, Layout-Container)
└── Label "Hallo"
Merke die Hierarchie: Stage enthält Scene enthält root enthält Kinder. Eine Komponente, die du mit
newerzeugst, aber keinem Container hinzufügst, erscheint nie.
Layout-Container: die Anordnung bestimmt der Container
Nicht die Komponente entscheidet, wo sie sitzt, sondern der Container, in dem sie liegt. Dieselben vier Komponenten ergeben in VBox, HBox und GridPane völlig verschiedene Oberflächen. Probier es aus:
Interaktive Visualisierung
Interaktive Komponente: probiere sie im Topic-Player oben aus.
Die wichtigsten Container:
| Container | Anordnung | Typischer Einsatz |
|---|---|---|
| VBox | vertikale Spalte | Formulare (Felder untereinander) |
| HBox | horizontale Reihe | Button-Leisten, Toolbars |
| GridPane | Raster (Spalte, Zeile) | Formulare mit Label + Feld nebeneinander |
| BorderPane | 5 Regionen (top/bottom/left/right/center) | App-Grundgerüst (Menü oben, Inhalt mitte) |
| StackPane | Komponenten übereinander | Overlays, zentrierter Inhalt |
Controls und Events
Controls sind die Bedien-Elemente: Button, Label, TextField, CheckBox. Sie werden dem Container hinzugefügt (getChildren().add(...) bzw. grid.add(c, col, row)).
Eine GUI reagiert auf Ereignisse. Mit setOnAction sagst du einem Button, was beim Klick passieren soll, in Form eines Lambdas (EventHandler):
Button btn = new Button("Klick mich");
btn.setOnAction(e -> label.setText("Geklickt!"));
Der Code im Lambda läuft nicht sofort, sondern erst, wenn der Nutzer klickt.
Interaktive Visualisierung
Interaktive Komponente: probiere sie im Topic-Player oben aus.
Klausur-Faustregeln
1. Hierarchie: Stage → Scene → root → Kinder. Die Stage ist das Fenster, die Scene ihr Inhalt, der root meist ein Layout-Container, darunter die Komponenten. Das ist der Scene-Graph.
2. Der Container bestimmt die Anordnung. VBox = Spalte, HBox = Reihe, GridPane = Raster, BorderPane = 5 Regionen. Die Komponente selbst weiß nicht, wo sie sitzt.
3. Komponenten müssen hinzugefügt werden. new Button(...) allein zeigt nichts. Erst container.getChildren().add(btn) (bzw. grid.add(btn, col, row)) macht sie sichtbar.
4. setOnAction(e -> ...) ist event-getrieben. Es registriert einen Handler; der Code läuft erst beim Klick, nicht sofort.
5. GUI-Code läuft auf dem JavaFX Application Thread. Lange Berechnungen dort lassen die Oberfläche einfrieren; solche Arbeit gehört in einen anderen Thread.
6. Einstieg über Application. Man erweitert Application, überschreibt start(Stage stage) und startet mit launch(args).
Häufige Stolpersteine
1. Falscher Container fürs Ziel. Eine HBox für ein Formular legt alle Felder nebeneinander statt untereinander. Erst überlegen: Spalte (VBox), Reihe (HBox) oder Raster (GridPane)?
2. Komponente vergessen hinzuzufügen. Mit new erzeugt, aber nie getChildren().add(...) aufgerufen, dann bleibt sie unsichtbar. Häufigster "warum sehe ich nichts"-Fehler.
3. Erwarten, dass das Event-Lambda sofort läuft. setOnAction(e -> ...) registriert nur. Der Code läuft beim Klick, nicht beim Aufruf von setOnAction.
4. Lange Arbeit im Event-Handler. Eine Schleife oder ein Download direkt im Handler blockiert den Application Thread, die UI friert ein. Auslagern auf einen Hintergrund-Thread.
5. GridPane-Koordinaten vertauschen. grid.add(node, col, row) nimmt zuerst die Spalte, dann die Zeile. Wer (row, col) denkt, platziert falsch.
6. Stage und Scene verwechseln. Die Stage ist das Fenster, die Scene der Inhalt. Eine Stage bekommt über setScene genau eine Scene.
Interaktiv verstehen
Den Scene-Graph aufbauen
Eine GUI entsteht von innen nach außen: erst die Komponente, dann der Container (root), dann die Scene, zuletzt die Stage. Verfolge im Stepper, wie der Baum Knoten für Knoten zusammengesetzt wird und erst show() das Fenster sichtbar macht.
Interaktive Visualisierung
Interaktive Komponente: probiere sie im Topic-Player oben aus.
Klausur-Tipp: Bei "Welcher Container für ein Login-Formular mit Feldern untereinander und einem Button darunter?" ist die Antwort meist VBox (oder GridPane für Label-Feld-Paare). Und: zeichne im Zweifel den Scene-Graph als Baum, das deckt fehlende add-Aufrufe sofort auf.
Praxis-Übung
Klausurfragen mit Lösungen (6)
- F1.Welcher Layout-Container ordnet seine Kinder in einer vertikalen Spalte (untereinander) an?
Antwort: VBox
Erklärung: VBox = vertical box, Kinder untereinander (klassisch fuer Formulare). HBox ordnet nebeneinander an, StackPane stapelt uebereinander.
- F2.Ein mit new Button("OK") erzeugter Button erscheint automatisch im Fenster.
Antwort: Falsch
Erklärung: Falsch. new erzeugt nur das Objekt. Sichtbar wird der Button erst, wenn er einem Container hinzugefuegt wird (z.B. vbox.getChildren().add(btn)) und dieser Teil des Scene-Graphs ist.
Typ: Wahr/Falsch
- F3.Was beschreibt die Hierarchie einer JavaFX-Oberfläche korrekt?
Antwort: Stage enthält Scene enthält root-Knoten enthält Kinder
Erklärung: Stage (Fenster) -> Scene (Inhalt) -> root-Knoten (meist Layout-Container) -> Kinder (Controls). Das ist der Scene-Graph, ein Baum von aussen (Fenster) nach innen (Komponenten).
- F4.Wann läuft der Code im Lambda von btn.setOnAction(e -> ...)?
Antwort: Erst wenn der Button geklickt wird
Erklärung: setOnAction registriert den Handler nur. Der Code laeuft erst, wenn das Ereignis (Klick) eintritt. Das ist event-getriebene Programmierung: man definiert WAS passieren soll, JavaFX entscheidet WANN.
- F5.Ordne jeden Container seiner Anordnung zu.
Zuordnungen:
- VBox → Kinder untereinander (Spalte)
- HBox → Kinder nebeneinander (Reihe)
- GridPane → Raster aus Spalten und Zeilen
- BorderPane → 5 Regionen: top/bottom/left/right/center
Erklärung: VBox (Spalte), HBox (Reihe), GridPane (Raster), BorderPane (5 Regionen). Der Container bestimmt die Anordnung der Komponenten.
Typ: Zuordnung
- F6.Eine GUI friert ein, sobald man einen Button klickt, der eine 10-Sekunden-Berechnung startet. Warum?
Antwort: Die Berechnung läuft im JavaFX Application Thread und blockiert die UI
Erklärung: Event-Handler laufen auf dem JavaFX Application Thread, demselben Thread, der die UI zeichnet. Eine lange Berechnung dort blockiert das Neuzeichnen, die Oberflaeche friert ein. Loesung: die Arbeit in einen Hintergrund-Thread auslagern (z.B. Task).
Klausur-Quiz
Klausurfragen mit Lösungen (6)
- F1.Was ist die Stage in JavaFX?
Antwort: Das Fenster selbst
Erklärung: Die Stage ist das Fenster. Ihr Inhalt ist die Scene, darin ein root-Knoten mit Komponenten. Stage -> Scene -> root -> Kinder.
- F2.Welcher Container passt am besten für ein Formular, bei dem links die Beschriftung und rechts das Eingabefeld steht (mehrere Zeilen)?
Antwort: GridPane
Erklärung: GridPane (Raster aus Spalten und Zeilen) ist ideal: Spalte 0 die Labels, Spalte 1 die Felder, je Zeile ein Paar. VBox koennte nur eine Spalte, HBox nur eine Reihe.
- F3.Bei grid.add(node, 0, 1) wird die Komponente in Spalte 0, Zeile 1 platziert.
Antwort: Wahr
Erklärung: Richtig. GridPane.add(node, columnIndex, rowIndex) nimmt ZUERST die Spalte, dann die Zeile. Eine haeufige Falle ist, (Zeile, Spalte) zu denken.
Typ: Wahr/Falsch
- F4.Der Scene-Graph ist ein Baum: die {{1}} ist das Fenster, die {{2}} ihr Inhalt, darin ein root-Knoten. Ein Button reagiert auf Klicks über die Methode {{3}}.
Lösungen pro Lücke:
- {{1}}: Stage
- {{2}}: Scene
- {{3}}: setOnAction
Erklärung: Stage (Fenster), Scene (Inhalt), setOnAction (registriert den Klick-Handler). Kern-Vokabular der JavaFX-Grundlagen.
Typ: Lückentext
- F5.Wie fügt man einen Button btn einer VBox box hinzu?
Antwort: box.getChildren().add(btn)
Erklärung: Bei VBox/HBox fuegt man Kinder ueber getChildren().add(...) bzw. addAll(...) hinzu. (GridPane nutzt stattdessen grid.add(node, col, row).) box.add gibt es bei VBox nicht.
- F6.Warum erscheint dieses Label nicht im Fenster?
Antwort: Das Label wurde nie der VBox hinzugefügt (getChildren().add fehlt)
Erklärung: Das Label wird erzeugt, aber nie in den Scene-Graph eingehaengt: root.getChildren().add(label) fehlt. Nur was im Baum unter der Scene haengt, wird gezeichnet. Erzeugen allein reicht nicht.
Label label = new Label("Hallo");
VBox root = new VBox();
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.show();