Ein erstes “Hello World” von JavaFX mit Maven
https://oer-informatik.de/jfx_02_helloworld_und_aufbau
tl/dr; (ca. 4 min Lesezeit): “Hello World” mit Java FX und Analyse der beteiligten Klassen, Objekte und Methoden. Artikel ist Teil eines JavaFX-Tutorials.
Änderungen am Programmcode…
In dem Beispielprogramm, das VSCode/Maven anlegt, sind schon einige Komponenten mehr enthalten, als wir am Anfang benötigen. Wir trennen uns von den Dateien, die wir nicht mehr benötigen:
Im Projekt liegen unter
\src\main\resources\de\csbme\ifaxx
die Dateienprimary.fxml
undsecondary.fxml
- die können gelöscht werden.Ebenso die beiden Klassen
PrimaryController.java
undSecondaryController.java
untersrc\main\java\de\csbme\ifaxx
Anpassungen in der Datei App.java
In der pom.xml
wurde ja bei der Konfiguration hinterlegt, wie die Klasse heißt, die unser Artefakt (in diesem Fall: unsere Desktop-App) startet.
Maven sucht nach einer public static void main(String[] args)
-Methode. Für das Grundgerüst benötigen wir also diese statische Methode, sowie eine zweite Methode start()
, die später unser eigentliches Programm aufnimmt:
package de.csbme.ifaxx;
/*Imports*/
public class App extends Application {
@Override
public void start(Stage primaryStage){
/*Implementierung*/
}
public static void main(String[] args) {
launch(args);
}
}
Mit diesem Grundgerüst kommen wir schon recht weit. Da Java Modular ist, und nur relativ wenig Bibliotheken direkt im Sprachumfang von Java enthalten sind, müssen wir in der Datei module-info.java
zunächst für unsere App festlegen, welche Module benötigt werden (zwei JavaFX Module) und was von Außen genutzt werden darf (unser komplettes Modul):
module de.csbme.ifaxx {
requires transitive javafx.graphics;
requires javafx.controls;
exports de.csbme.ifaxx;
}
Jetzt können wir die Platzhalter in der App.java
füllen. Die Methode start()
ist das Herzstück unseres ersten eigenen JavaFX-Programms. Hieran können wir die Grundlagen eins jeden JavaFX-Programms erkennen:
@Override
public void start(Stage primaryStage){
Text textLeaf = new Text("Hallo");
StackPane rootNode = new StackPane(textLeaf);
Scene scene = new Scene(rootNode, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
Die Stage erhalten wir als Parameter übergeben, von wem genau schauen wir uns später an. Die Stage ist der Ort, an dem alles angezeigt wird - unsere Bühne eben. Wir schleichen uns von der letzten Zeile der Methode (primaryStage.show();
) nach oben. Die Dinge, die wir auf der Bühne anzeigen nennen wir Scene - also Szenen (primaryStage.setScene(scene);
). In unserem Beispiel ist die Scene 300x200 Pixel groß und zeigt etwas an, das hier rootNode
genannt wurde (new Scene(rootNode, 300, 250);
). Ein Node ist ein Inhaltselement, das weitere Inhaltselemente enthalten kann (z.B. eine Tabelle, ein Gitter, ein Stapel). In unserem Fall enthält der Stapel (StackPane
) nur ein Element, nämlich einen Text (new StackPane(textLeaf);
). Diesen Text haben wir in der ersten Zeile der Methode erstellt (Text textLeaf = new Text("Hallo");
).
Was jetzt noch fehlt, um ein lauffähiges Programm zu erhalten, sind die fehlenden Importe. Wenn es die IDE nicht alleine schafft, die korrekten Klassen zu finden, dann hilft vielleicht dieser Spickzettel zum vergleichen:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;
Wer ruft hier eigentlich wen auf?
Es scheinen bei JavaFX wieder von Zauberhand Dinge zu passieren, die schwer nachvollziehbar sind: In der main()
-Methode wird eine launch()
-Methode aufgerufen, die nirgends implementiert ist. Stattdessen gibt es eine start()
-Methode, die wiederum nirgends aufgerufen wird. Wir müssen hier kurz Licht ins Dunkel bringen, in dem wir uns mal ein UML-Klassendiagramm anschauen:

Das erste Geheimnis ist schnell gelüftet: die mysteriöse Methode launch()
, die in der main()
-Methode aufgerufen wird, ist eine statische Methode der Superklasse. Aber an welcher Stelle wird eine Instanz von App gebildet, um die Instanzmethode start()
aufrufen zu können, die wir oben implementiert haben?
Dazu werfen wir ein Blick in ein UML-Sequenzdiagramm, das die Abläufe im Hintergrund etwas erklärt:

Der Dreh- und Angelpunkt ist die launchApplication()
-Methode einer Klasse, die LauncherImpl
heißt. Diese Methode erzeugt die Stage, auf der später alles angezeigt wird, instanziiert die Klasse App
(hier allgemein StartApp
genannt) und ruft schlussendlich die start()
-Methode auf, die dann wiederum die Stage selbst anzeigt (show()
).
Wer noch etwas mehr über die Hintergründe und Realisierungen erfahren will, der kann sich den Quelltext der Superklasse Application sowie der Klasse LauncherImpl ansehen.
Ausführen des JavaFX-Projekts
Nächste Schritte
Dieser Artikel ist ein Teil der Artikelserie zu einer Energiemonitors mit JavaFX.
Ein leeres Projekt ist kein schönes Projekt. Wir brauchen Struktur und dazu den Scenegraph.
Links und weitere Informationen
Quellen und offene Ressourcen (OER)
Die Ursprungstexte (als Markdown), Grafiken und zugrunde liegende Diagrammquelltexte finden sich in weiterbearbeitbarer Form im gitlab-Repository unter https://gitlab.com/oer-informatik/java-fx/ersteschritte und sind zur Nutzung als Open Education Resource (OER) freigegeben gemäß der Creative Commons Namensnennung 4.0 International Lizenz (CC BY 4.0).