JavaFX wie JavaFX Projekt aufsetzen?

Heinz Kurz

Mitglied
Hi!
Ich würde gerne von Swing zu JavaFX wechseln. Hat jemand eine gute Anleitung, wie man ein neues JavaFX Projekt beginnt? Mit den bisherigen Internetrecherchen bin ich immer gescheitert.
Als IDE würde ich NetBeans bevorzugen, mir ist aber auch alles andere recht, sogar ein reiner Texteditor. Ein GUI-Designer wäre super, muss aber auch nicht unbedingt sein.
Danke.
 
Die Dokumentation vn @temi ist auf jeden Fall ein guter Startpunkt und auch die Empfehlung Maven oder Gradle zu nutzen, teile ich zu 100%.

Aber die Erfahrung zeigt, dass es leider bezüglich Abhängigkeiten immer noch Probleme gibt, da einige Abhängigkeiten bis heute keine Moduklbeschreibung haben. Das ist mit ein Grund, wieso ich das Vorgehen mit dem openjfx Plugin nicht für so gut halte.
Aber es ist ein sehr valider Start!

Bei Maven Projekten bin ich immer noch auf dem Standpunkt "Das ist alles nur geklaut" - wie es die Prinzen schon besungen haben: Ich gehe immer (wenn es keinen Generator gibt wie Spring Initializr) sehr gerne hin und kopiere mir, was ich brauche. Für JavaFX Projekte ist mein Startpunkt immer mein GitHub Repository: https://github.com/kneitzel/JavaFXMavenApp

Da sind halt einige DInge drin, die ich für wichtig halte. Angefangen bei einer Prüfung, ob es von Abhängigkeiten neue Versionen gibt über Moditec, um Abhängigkeiten eine Modulbeschreibung unter zu schieben über Statische Codeanalyse.

Egal wie Du startest: Nimm auf jeden Fall eine Entwicklungsumgebung! Also fang nicht an mit Texteditor oder so! (Wenn es keine volle Entwicklungsumgebung sein soll, dann wenigstens einen Editor mit entsprechenden Erweiterungen wie Visual Studio Code oder so!)
Aber Wntwicklungsumgebung bei Java - da macht es Sinn, IntelliJ, Netbeans oder Eclipse zu nutzen. Wobei ich Anfängern von Eclipse explizit abraten will - und bei JavaFX machst Du Dich da vermutlich auf einen Horrortripp auf weil Du früher oder später mit Plugins starten wirst und da dann keine oder veraltete Dokumentation haben wirst ... Du wärst nicht der erste, der sich durch viele veraltete Plugins sein Eclipse etwas zerschießt 🙂 ).

Ich kann Anfängern IntelliJ sehr ans Herz legen! Die Community Edition ist alles, was man braucht und die ist Open Source! Und es ist extrem Anfängerfreundlich - das fängt schon mit den JDKs an - da musst Du auf dem System nicht sonst irgendwas installieren und machen sondern das kannst Du alles intern in IntelliJ machen. Über gute Problemlösungen die dann oft nur eine Klick entfernt sind (bei der IntelliJ Konfiguration - da geht es nicht um Refactorings bei Fehlern im Code - das haben alle!)

Grafischer Editor: Das ist der Scene Builder. Den kann man bei Gluon herunter laden. Aber bei IntelliJ ist das integriert. Einfach eien fxml Datei öffnen. Da hast Du erst eine Text Version aber Du kannst dann einfach den Reiter wechseln. Da der SceneBuilder noch nicht im IntelliJ enthalten ist, hast Du dann vermutlich erst oben einen blauen Textzug zum anklicken, der den SceneBuilder herunter lädt.
Dann fehlt beim ersten Mal die JavaFX Runtime - erneut so ein blauer Text zum anclicken.
--> Fertig! Sehr Anfängerfreundlich!

Das einfach einmal als paar Informationen von meiner Seite.
 
Ich würde empfehlen Maven oder Gradle zu nutzen, um die Abhängigkeiten zu erfüllen (das würde ich eigentlich für fast jedes Projekt empfehlen, egal ob JavaFX oder nicht).
Das kann ich mittlerweile bestätigen. Ich persönlich habe mich die letzten zwei Monate mit Gradle herumgeschlagen. Es ist eine eigene Welt, das Werkzeug läßt dir sehr viele Freiheiten, allerdings muß man auch wissen wie man diese Freiheiten nutzen kann. Das ist nicht einfach. Allerdings hat man dann ein paar tolle neue Möglichkeiten.

JavaFX in Gradle einzubinden ist nicht ganz so einfach. Es wird nicht wie eine normale Bibliothek eingebunden, wie man es in jedem Tutorial sieht, sondern über ein Plug-In. Wie überall haben die JavaFX-Frickler auch hier einen Sonderweg gewählt, den so niemand sonst gehen würde.
 
Moin, sorry wenn ich hier reingrätsche.

Auch auf Empfehlung von Konrad hier, habe ich versucht, meine ersten Gehversuche mit JavaFX auf IntelliJ zu starten. Einfach ein neues JavaFX-Projekt mit Maven erstellt und gestartet. Platsch auf die Nase gefallen.

Beim Ausführen wird gemeldet, dass eu.hansolo.xxx nicht gefunden würde. Das ist das automatisch erstellte Projekttemplate! Nun ist mir aufgefallen, dass in POM.xml

XML:
        <dependency>
            <groupId>eu.hansolo</groupId>
            <artifactId>tilesfx</artifactId>
            <version>17.1.15</version>
            <exclusions>
                <exclusion>
                    <groupId>org.openjfx</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

die Version 17.1.15 angegeben ist, in der Liste der externen Bibliotheken aber einige Versionen davon abweichen


2023-03-07 14_20_34-fx01 – pom.xml (fx01).png

Angemeckert werden alle Teile, die nicht die Version 17.1.15 aufweisen.

Wie fixt man sowas? Ein Reload Project hat nichts gebracht.

Oder liegt es an was annerm?

System ist IntelliJ 2022.3.2 unter Win11


Joachim

--EDIT--

Visual Studio Code nudelt sich bei einer entsprechenden Projekterstellung tot und kommt nicht zum Ende. Ich muss abbrechen.
 
Zuletzt bearbeitet:
Bitte bei sowas immer die ganze pom zeigen. Und mal ein mvn dependency:tree aufrufen und die Ausgabe einmal posten.
 
Ganze POM? kommt!

XML:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>fx01</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>fx01</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>5.9.1</junit.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>19</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>19</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-web</artifactId>
            <version>19</version>
        </dependency>
        <dependency>
            <groupId>org.controlsfx</groupId>
            <artifactId>controlsfx</artifactId>
            <version>11.1.2</version>
        </dependency>
        <dependency>
            <groupId>com.dlsc.formsfx</groupId>
            <artifactId>formsfx-core</artifactId>
            <version>11.5.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.openjfx</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>net.synedra</groupId>
            <artifactId>validatorfx</artifactId>
            <version>0.4.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.openjfx</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.kordamp.ikonli</groupId>
            <artifactId>ikonli-javafx</artifactId>
            <version>12.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.kordamp.bootstrapfx</groupId>
            <artifactId>bootstrapfx-core</artifactId>
            <version>0.4.0</version>
        </dependency>
        <dependency>
            <groupId>eu.hansolo</groupId>
            <artifactId>tilesfx</artifactId>
            <version>17.1.15</version>
            <exclusions>
                <exclusion>
                    <groupId>org.openjfx</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.10.1</version>
                <configuration>
                    <source>19</source>
                    <target>19</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.8</version>
                <executions>
                    <execution>
                        <!-- Default configuration for running with: mvn clean javafx:run -->
                        <id>default-cli</id>
                        <configuration>
                            <mainClass>com.example.fx01/com.example.fx01.HelloApplication</mainClass>
                            <launcher>app</launcher>
                            <jlinkZipName>app</jlinkZipName>
                            <jlinkImageName>app</jlinkImageName>
                            <noManPages>true</noManPages>
                            <stripDebug>true</stripDebug>
                            <noHeaderFiles>true</noHeaderFiles>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Und die Abhängigkeiten: Ich weiß jetzt nicht genau, ob ich das Gewünschte erwischt habe

  • Maven: com.dlsc.formsfx:formsfx-core:11.5.0
  • Maven: eu.hansolo.fx:countries:17.0.23
  • Maven: eu.hansolo.fx:heatmap:17.0.12
  • Maven: eu.hansolo:tilesfx:17.1.15
  • Maven: eu.hansolo:toolbox:17.0.26
  • Maven: eu.hansolo:toolboxfx:17.0.29
  • Maven: net.synedra:validatorfx:0.4.0
  • Maven: org.apiguardian:apiguardian-api:1.1.2
  • Maven: org.controlsfx:controlsfx:11.1.2
  • Maven: org.junit.jupiter:junit-jupiter-api:5.9.1
  • Maven: org.junit.jupiter:junit-jupiter-engine:5.9.1
  • Maven: org.junit.platform:junit-platform-commons:1.9.1
  • Maven: org.junit.platform:junit-platform-engine:1.9.1
  • Maven: org.kordamp.bootstrapfx:bootstrapfx-core:0.4.0
  • Maven: org.kordamp.ikonli:ikonli-core:12.3.1
  • Maven: org.kordamp.ikonli:ikonli-javafx:12.3.1
  • Maven: org.openjfx:javafx-base:19
  • Maven: org.openjfx:javafx-base:win:19
  • Maven: org.openjfx:javafx-controls:19
  • Maven: org.openjfx:javafx-controls:win:19
  • Maven: org.openjfx:javafx-fxml:19
  • Maven: org.openjfx:javafx-fxml:win:19
  • Maven: org.openjfx:javafx-graphics:19
  • Maven: org.openjfx:javafx-graphics:win:19
  • Maven: org.openjfx:javafx-media:19
  • Maven: org.openjfx:javafx-media:win:19
  • Maven: org.openjfx:javafx-web:19
  • Maven: org.openjfx:javafx-web:win:19
  • Maven: org.opentest4j: opentest4j:1.2.0

oder so?

2023-03-07 15_42_21-fx01 – mvnw.png
 
Ok, das war jetzt etwas interessanter, denn den Fehler hatte ich so nicht nicht gesehen.

Nur zur Prüfung: Dein Problem ist, dass angemeckert wird:
Code:
[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ fx01 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 5 source files to /Users/konrad/Downloads/tmp/target/classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] Modul nicht gefunden: eu.hansolo.fx.countries
[ERROR] Modul nicht gefunden: eu.hansolo.fx.heatmap
[ERROR] Modul nicht gefunden: eu.hansolo.toolboxfx
[ERROR] Modul nicht gefunden: eu.hansolo.toolbox


Das Problem liegt hier:
Code:
[INFO] +- eu.hansolo:tilesfx:jar:17.1.15:compile
[INFO] |  +- eu.hansolo:toolbox:jar:17.0.26:runtime
[INFO] |  +- eu.hansolo:toolboxfx:jar:17.0.29:runtime
[INFO] |  +- eu.hansolo.fx:heatmap:jar:17.0.12:runtime
[INFO] |  \- eu.hansolo.fx:countries:jar:17.0.23:runtime

Du erkennst, dass die Abhängigkeiten von eu.hansolo:tilesfx.jar auf "runtime" steht. Daher werden diese nicht im Image mit bereit gestellt so dass JLink scheitert. Das ist ein Fehler, den ich dem Entwickler melden würde. Das runtime ist da falsch, da die Abhängigkeiten so nicht richtig gezogen werden. Wenn der Entwickler der Komponente bei den Abhängigkeiten einfach nur den Scope rausnehmen würde, dann würde es funktionieren.

Workaround für Dich: Packe diese Pakete auch als Abhängigkeiten in deine POM. Dann werden die auch geladen und gefunden.
 
Danke für den Hinweis und die Erklärung.

Es hat geklappt. Leider auch nicht auf Anhieb, denn plötzlich hieß es, javafx.swing könne nicht aufgelöst werden. Hab's hinbekommen.

Mich wunderts, weil das das Template für neue Projekte von IntelliJ für JavaFX ohne irgendwelche Änderungen ist und das trotzdem von alleine nicht hochkommt.

Das mit diesen Abhängigkeiten ist wohl eine große Schwäche von Java. Das macht es nicht einfacher.
 
Also das Template von IntelliJ für JavaFX Projekte ist doch einfach nur eine minimale POM mit JavaFX Plugin und halt der JavaFX Abhängigkeit. Das sollte direkt funktionieren.

Und Abhängigkeiten sind eigentlich ein großer Vorteil - egal ob Java mit Maven, Visual Studio mit nuget oder JavaScript mit npm - das klappt in der Regel sehr gut.

Nur eben ist es problematisch, wenn Fehler in Paketen sind (das wäre gerade meine Interpretation Deines Falles) oder es zu viele Abhängigkeiten untereinander gibt.

Wobei Java auf dem Desktop kaum eine Rolle spielt. Das trifft Dich dann, denn so Fehler werden dann kaum gemeldet und auch die Entwicklung stockt. Das ist im Backend Bereich anders - egal welche Technologie oder Framework man wählt.

Deine Sichtweise kann ich also sehr gut nachvollziehen und ich sehe da auch diverse Probleme - auch wenn diese etwas von Deiner Sicht abweichen.

Das Wichtige ist aber: es freut mich, dass du die Probleme beheben konntest und somit wieder einen Schritt weiter bist!
 

Zurück
Oben