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_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)
Nastavit:
Project Properties
/ Sources
/ Source/Binary Format
nastavit na 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
)
Chyba při kompilaci:
Fatal error compiling: invalid flag: –module-path
Řešení:
Odstranit soubor module-info.java
(NetBeans ho ukazuje v <default package>
)
Ze souboru pom.xml
odstranit sekci <build>…</build>
a <dependencies>…</dependencies>
Je možné odstranit také soubor 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
)
Vytvořit nový projekt:
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
Řešení:
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
clean javafx:run
a vymazat obsah pole 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
--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
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
.
Při vytváření nového projektu postupujme podle návodu zde v sekci JavaFX and IntelliJ, Non-modular with Maven:
Z nabídky zvolíme “New Project”, v dialogu „ProjectSDK:“ 15.0.1 (měli by fungovat i jiné verze nad 11), zaškrtnout „Create from achetype“. Při prvním zakládání projektu JavaFX klik na tlačítko „Add Archetype“, v dialogu vyplnit:
„GroupId:“ org.openjfx
,
„ArtifactId:“ javafx-archetype-simple
(případně javafx-archetype-fxml
, pokud vytváříme FXML projekt)
„Version:“ 0.0.6
„Repository:“ se nemusí zadávat (implicitní hodnota se nastaví podle „File“→„Settings“→„Build, Execution, Deployment“→ „Remote Jar Repositories“)
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>org.example</groupId> <artifactId>ideafxtest</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.6</version> <executions> <execution> <!-- Default configuration for running --> <!-- Usage: mvn clean javafx:run --> <id>default-cli</id> <configuration> <mainClass>org.example.App</mainClass> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
by měl kompilovat bez problémů.
Z pravého panelu „Maven“ → „Plugins“ → „javafx“ → „javafx:run“
Další běhy:
V okně aktuální konfigurace (vpravo nahoře, vlevo vedle zelené šipky „Run“) vybrat: nazev_aplikace[javafx:run]
Z pravého panelu „Maven“ → „Plugins“ → „javafx“ → „javafx:run“ → pravý klik, z pop-up vybrat Debug nazev_aplikace[javafx:run]
V okně „Run“ vidíme:
Listening for transport dt_socket at address: 8000
vpravo pak Attach debugger
, toto poklepat, nebo z hlavní nabídky Run
vybrat Attach to Process
a poté zvolit aplikaci pro ladění.
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.