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:
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)
javafx-archetype-simple
javafx-archetype-fxml
„Version:“ 0.0.6
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]
nazev_aplikace[javafx:run]
Z pravého panelu „Maven“ → „Plugins“ → „javafx“ → „javafx:run“ → pravý klik, z pop-up vybrat Debug nazev_aplikace[javafx:run]
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í.
Listening for transport dt_socket at address: 8000
Attach debugger
Attach to Process
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.