[[oktatas:programozás:java:java_fx|< Java FX]]
====== Java FX Visual Studio Code ======
* **Szerző:** Sallai András
* Copyright (c) 2022, Sallai András
* Szerkesztve: 2022, 2024
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]]
* Web: https://szit.hu
===== Telepítés =====
Szükséges szoftverek:
* JavaSE JDK
* JavaFX
* Visual Studio Code
JavaSE JDK:
* https://www.oracle.com/java/technologies/javase-downloads.html (2021)
JavaFX:
* https://gluonhq.com/products/javafx/ (2021)
* Szükséges operációs rendszertől függően:
* JavaFX Windows SDK
* JavaFX Mac OS X SDK
* JavaFX Linux SDK
Visual Studio Code:
* https://code.visualstudio.com/ (2021)
===== VSCode bővítmény =====
Szükséges bővítmény:
* JavaFX Support
* SceneBuilder extension for Visual Studio Code
===== A Java VSCode-ban =====
A JavaSE JDK feltelepíthető Visual Studio Code-ból is.
Ehhez hozzuk elő a parancs panelt:
* Ctrl + Shift + p
Kezdjük el írni:
Java
Válasszuk a következő lehetőséget:
Configure Java Runtime
Megjelenik a "Configure Java Runtime" felülete.
Az oldalon találunk egy [ Download ] gombot, amivel telepíthető a JavaSE JDK.
A már telepített Java verziók megtekinthetők a "Intalled JDKs" fülön.
Ha VSCode-on kívül telepítettünk JavaSE JDK-t, azok is megjelennek itt.
Telepítés után, indítsuk újra a Visual Studo Code-t.
===== JavaFX =====
Windows esetén kapunk egy ilyen fájlt:
* openjfx-11.0.2_windows-x64_bin-sdk.zip
Csomagoljuk ki, például:
C:\Users\janos\Library\openjfx
===== JavaFX projekt =====
Készítsünk egy JavaFX projektet.
Kattintsunk:
* View > Command Palette
Kezdjük el írni, és válasszuk:
Java: Create Java Create...
Legyen egy builder nélküli projekt.
Most hozzá kell adni a projekthez a JavaFX .jar fájlokat.
Nyissuk meg a létrehozott App.java fájlt.
Az oldalsávon megjelenik a "JAVA PROJECTS" nézet. Keressük meg a "**Referenced Libraries**" a fanézetben.
A felirat mellett kattintsunk a "+" gombra. Az előugró párbeszédablakban keressük meg a JavaFX lib
könyvtárban található .jar kiterjesztésű fájlokat. Válasszuk ki mindent.
* javafx.base.jar
* javafx.controls.jar
* javafx.fxml.jar
* javafx.graphics.jar
* javafx.media.jar
* javafx.swing.jar
* javafx.web.jar
* javafx-swt.jar
A fanézetben a "**Referenced Libraries**" alatt megjelennek a programozói könyvtárak.
Ugyanakkor a VSCode hivatkozást helyez el a projekt könyvtárában a következő fájlban:
* .vscode/settings.json
===== Kód a kezdéshez =====
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
public class App extends Application {
@Override
public void start(Stage stage) {
StackPane root = new StackPane();
Scene scene = new Scene(root, 300, 250);
stage.setScene(scene);
stage.setTitle("Valami");
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Ha most futtatjuk, hibát kapunk:
/usr/bin/env /usr/lib/jvm/java-17-openjdk-amd64/bin/java -XX:+ShowCodeDetailsInExceptionMessages -Dfile.encoding=UTF-8 @/tmp/cp_c28gippgcrq8r670mlunh45sf.argfile App
Error: JavaFX runtime components are missing, and are required to run this application
===== Konfiguráció hozzáadása =====
Adjunk konfigurációt a projektünkhöz:
* Run > Add configuration...
Létrejön a .vscode könyvtárban egy launch.json fájl, ami automatikusan
megnyílik. Alapértelmezetten két konfiguráció van benne. Nem kell többet
felvenni.
Vegyük fel a minden "request" tulajdonság után, saját "vmArgs" tulajdonságunkat.
A következő kódot **javítsuk** saját útvonal alapján:
Windows alatt is "/" jelek vagy kettő darab "\", azaz "\\" szükséges!
"vmArgs": "--module-path ${userHome}/Library/javafx-sdk-19/lib --add-modules javafx.controls,javafx.fxml",
Ügyeljünk arra, hogy az útvonal a saját javafx-sdk helye legyen beállítva.
A program elkészült, futtatható.
{{:oktatas:programozas:java:java_fx:javafx_hello_app.png|}}
===== Alternatív indítás =====
* A Java projekt létrehozása után adjuk hozzá a függőségeket.
* Az akciósávon kattintsunk a "Run and Debug".
* To customize Run and Debug **create a launch.json file**.
{{:oktatas:programozas:java:java_fx:run_and_debug_create_a_launch.png|}}
* A mainClass legyen az induló osztály.
* A vmArgs tulajdonság számára állítsa be a javafx helyes útvonalát.
"configurations": [
{
"type": "java",
"name": "Launch App",
"request": "launch",
"mainClass": "App",
"vmArgs": "--module-path /home/janos/Library/javafx/javafx-sdk-19/lib --add-modules javafx.controls,javafx.fxml"
}
]
{{:oktatas:programozas:java:java_fx:run_and_debug_start_play.png|}}
Forrás:
* https://openjfx.io/openjfx-docs/ (2022)
===== Másik fxml betöltési lehetőség =====
Adott két fxml fájl:
* mainScene.fxml
* secondScene.fxml
Legyen cserélhető az FXML állomány:
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class App extends Application {
private static Scene scene;
public static void main(String[] args) throws Exception {
launch(args);
}
@Override
public void start(Stage stage) throws IOException {
scene = new Scene(loadFXML("mainScene"));
stage.setScene(scene);
stage.show();
}
private static Parent loadFXML(String fileName) throws IOException {
FXMLLoader loader = new FXMLLoader(App.class.getResource(fileName+".fxml"));
return loader.load();
}
static void setRoot(String fileName) {
try {
trySetRoot(fileName);
}catch(IOException e) {
System.err.println("Hiba! Az FXML betöltése sikertelen!");
System.err.println(e.getMessage());
}
}
static void trySetRoot(String fileName) throws IOException {
scene.setRoot(loadFXML(fileName));
}
}
A cserek az App.setRoot() utasítással lehetséges.
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
public class MainController {
@FXML
void onClickButton(ActionEvent event) {
App.setRoot("secondScene");
}
}
===== Sinto csomag használata =====
* mkdir app01
* cd app01
* code .
* sin javafx
* Másold a JavaFX .jar és .so fájlokat a például lib/javafx könyvtárba.
* Nyisd meg az App.java fájlt
* Futtasd az App.java fájlt. Ez hibára fut.
* sin javafx -p lib/javafx
* Készít a mainScene.fxml fájlban valamit
* kész