Search
JavaFX je multiplatformní GUI toolkit pro Java a původně byl zamyšlen coby nástupce GUI knihovny Java Swing zejména pro vytvoření internetových aplikací. Vývoj ovšem pokračoval jiným směrem (nástup technologií založených na JavaScript+HTML+CSS), a tak, přestože v současné době je JavaFX nejmodernějším nástrojem na tvorbu GUI v Java, po verzi 1.8 byl vyřazen ze standardní distribuce Java SDK. O jeho další vývoj se stará společnost Gluon a je dostupné na stránkách OpenJFX. Za této situace je celkem pochopitelné, že při vytváření první vzorové aplikace v prostředí NetBeans (jehož vlastník se po verzi 8 taktéž změnil ze společnosti Oracle na Apache Foundation) v současné době (březen 2020) narazíme na určité potíže. Následující poznámky by měli ulehčit jejich překonání.
Vytvořme tedy první program (analogie „Hello world“) JavaFX v prostředí NetBeans 11.3. Vyžaduje po „naklikání“ vzorového projektu ještě několik drobných úprav podle toho jestli používáme verzi Java 1.8 (připomínám, že je to poslední verze jež v Oracle distribuci obsahoval Java FX, a verze, pro nějž jsou koncipovány materiály předmětu PJV) nebo pro modernější Java 13.
Doporučení:
V případě potíží doporučuji upravit soubor netbeans.conf v podadresáři etc instalačního adresáře NetBeans tak, aby aplikace explicitně používala nejnovější instalovanou verzi Java SDK:
netbeans.conf
etc
netbeans_jdkhome=“vase/cesta/k/jdk”
např.
netbeans_jdkhome=“C:\Program Files\Java\jdk-13.0.1”
Vytvořit nový projekt:
File /New Project / Java with Maven / Simple (resp. FXML) JavaFX Maven Archetype (Gluon)
File
New Project
Java with Maven
Simple
FXML
JavaFX Maven Archetype (Gluon)
Nastavit:
Project Properties / Sources / Source/Binary Format nastavit na 1.8
Project Properties
Sources
Source/Binary Format
1.8
Project Properties / Build-Compile / Java Platform nastavit na JDK 1.8 (Případně ho přidat přes tlačítko Manage Java Platforms)
Build-Compile
Java Platform
JDK 1.8
Manage Java Platforms
Chyba při kompilaci:
Fatal error compiling: invalid flag: –module-path
Řešení:
Odstranit soubor module-info.java (NetBeans ho ukazuje v <default package>)
module-info.java
<default package>
Ze souboru pom.xml odstranit sekci <build>…</build> a <dependencies>…</dependencies>
pom.xml
<build>…</build>
<dependencies>…</dependencies>
Je možné odstranit také soubor nbactions.xml.
nbactions.xml
V jednom z projektů může dojít k chybě:
…cannot find symbol
Je pak nutné nahradit klíčová slova var - jež Java 1.8 ještě nezná - aktuálním typem proměnné (v mém případě String, String, Label, Scene)
var
String
Label
Scene
File / New Project / Java with Maven / Simple (or FXML) JavaFX Maven Archetype (Gluon)
Nejde spustit, hlásí:
JavaFX runtime components are missing, and are required to run this application
A. spoléháme-li na závislosti z repozitáře Maven (a nemáme instalovaný runtime JavaFX) můžeme
v Project Properties / Actions / Run project a/nebo Run file via main() změnit Execute Goals na
Actions
Run project
Run file via main()
Execute Goals
clean javafx:run
a vymazat obsah pole Set properties.
Set properties
(podrobný popis najdete zde: https://openjfx.io/openjfx-docs/#IDE-NetBeans sekce „Non-modular with Maven“)
B. pokud je v OS instalovaná identická verze runtime JavaFX i mimo systém Maven
lze do Project Properties / Run / VM Options doplnit
Run
VM Options
--module-path "vase/cesta/k/javafx-sdk-13.0.1/lib" --add-modules=javafx.controls,javafx.fxml
např. ve Windows:
--module-path "C:/Program Files/Java/javafx-sdk-13.0.1/lib" --add-modules=javafx.controls,javafx.fxml
nebo v Ubuntu:
--module-path /opt/java/javafx/javafx-sdk-14/lib --add-modules=javafx.controls,javafx.fxml
(podrobný popis najdete na stránce: https://openjfx.io/openjfx-docs/#IDE-NetBeans sekce „Non-modular from IDE“)
Když projekt ani nekompiluje, je namístě kontrolovat závislosti (dependencies), a pokud je třeba, přidat Maven dependency:
Group Id: org.openjfx Artifact Id: javafx-controls Version: např. 13
org.openjfx
javafx-controls
13
tak, aby se v pom.xml objevila sekce (nebo tam přímo doplnit):
<dependencies> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>13</version> </dependency> </dependencies>
Pokud vytvářáme FXML projekt, je třeba obdobně přidat i závislost javafx-fxml.
javafx-fxml
Při vytváření nového projektu postupujme podle návodu zde v sekci JavaFX and IntelliJ, Non-modular with Maven.
Jako archetyp (tj. šablonu) projektu můžeme zvolit groupId: org.openjfx, artifactId javafx-maven-archetypes a version 0.0.3, ovšem na třetí obrazovce změníme archetypeArtifactId na javafx-archetype-simple (případně javafx-archetype-fxml, pokud vytváříme FXML projekt) a verzi např. na současně nejvyšší 0.0.5.
javafx-maven-archetypes
0.0.3
javafx-archetype-simple
javafx-archetype-fxml
0.0.5
Ukázkový projekt s podobným obsahem pom.xml:
<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 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cz.cvut.fel.pjv</groupId> <artifactId>fxJava13mavenTest</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>13</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <release>11</release> </configuration> </plugin> <plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>0.0.4</version> <configuration> <mainClass>cz.cvut.fel.pjv.App</mainClass> </configuration> </plugin> </plugins> </build> </project>
by měl kompilovat a běžet bez problémů.
Rozsáhlý seznam rad, jak začít s JavaFX pro různé kombinace vývojových prostředí a nástrojů najdete v dokumentaci Open JFX.