[[oktatas:programozás:java:java_fx|< Java FX]] ====== Scene Builder ====== * **Szerző:** Sallai András * Copyright (c) 2021, Sallai András * Szerkesztve: 2021, 2022, 2024 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]] * Web: https://szit.hu ===== A SceneBuilder beszerzése ===== * https://gluonhq.com/products/scene-builder/ (2022) Ez csak a régi Java 8-hoz van: * https://www.oracle.com/java/technologies/javase/javafxscenebuilder-info.html Rendelkezésre áll: * Windowsos .msi csomag. Például: SceneBuilder-19.0.0.msi * Linuxos .deb csomag. Például: SceneBuilder-19.0.0.deb A linuxos verzió telepítése: dpkg -i SceneBuilder-19.0.0.deb Az /opt könyvtárba telepszik. Debian GNU/Linux 12-ön, telepítés előtt létre kell hozni egy desktop-directories könyvtárat: sudo mkdir /usr/share/desktop-directories/ Nélküle a következő hibát kapjuk: xdg-desktop-menu: No writable system menu directory found. ===== Visual Studio Code ===== ==== Bővítmény ==== Bővítmény telepítése: * SceneBuilder extension for Visual Studio Code A parancs panelon keresztül konfiguráljuk. Gépeljük be: Scene Válasszuk a következőt: Configure Scene Builder path Keressük meg az előugró párbeszédablakban a futtatható SceneBuilder szerkesztőt. Például: /opt/scenebuilder Amit ki kell választani: /opt/scenebuilder/bin ===== VSCodium ===== ==== Bővítmény ==== A következő bővítményre van szükség: * SceneBuilder extension for Visual Studio Code A bővítmény nem érhető el tárolóból. Ezért töltsük le innen: * https://marketplace.visualstudio.com/items?itemName=bilalekrem.scenebuilderextension (2024) Jobb oldalon találunk egy "Download Extension" linket. Letöltés után, ha 1.0.1 verzónk van: codium --install-extension bilalekrem.scenebuilderextension-1.0.1.vsix ===== VSCode és VSCodium beállítása ===== A parancs panelon keresztül konfiguráljuk. Gépeljük be: Scene Válasszuk a következőt: Configure Scene Builder path Keressük meg az előugró párbeszédablakban a futtatható SceneBuilder szerkesztőt. Amit ki kell választani: /opt/scenebuilder/bin ===== VSCode és VSCodium használat ===== Készítsünk egy üres állományt, például: mainScene.fxml vagy: app.fxml Az állományon **jobb egér gomb**, majd: * Open in Scene Builder {{:oktatas:programozas:java:java_fx:vscode_open_scenebuilder.png?500|}} ===== Az FXML betöltése ===== A következő sor szükséges az fxml fájl használatához. Parent root = FXMLLoader.load(getClass().getResource("mainScene.fxml")); Ezek után a Scene() konstruktorában megadjuk: Scene scene1 = new Scene(root, 300, 250); A teljes start() függvény: @Override public void start(Stage primaryStage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("mainScene.fxml")); Scene scene1 = new Scene(root, 300, 250); primaryStage.setScene(scene1); primaryStage.show(); } A kivételeket eldobtuk. A getResource() az IOException kivételt vált ki. ===== Eseménykezelés ===== Eseménykezeléshez meg kell adni: * A kezelő metódus nevét a jobboldalon a Button "Code" tulajdonságainál. * Bal oldalon a "Controller" tulajdonságoknál meg kell adni a kontroller osztályt. * Ha még nincs kontroller megadható, például az App osztály. {{:oktatas:programozas:java:java_fx:javafx_scenebuilder.png?500|}} Ha a MainController könyvtárban van, például egy controllers könyvtárban: controllers.MainController Vegyük észre a (.) pont karaktert, a (/) perjel vagy a (\) visszaperjel karakter helyett. Eseménykezelő az App.java fájlon belül: @FXML protected void onClickMehetGomb(ActionEvent event) { System.out.println("Működik"); } Ha akcióknak van egy célkomponense azt szerepeltetni kell a SceneBuilder Code részén, a fx:id mezőben, egy tetszőleges névvel: Ugyanennek a névnek szerepelnie kell az osztályban, ahol hivatkozni szeretnénk rá, egy FXML annotációval: @FXML private Text celfelirat; Együtt az eseménykezelővel: @FXML private Label celfelirat; @FXML protected void onClickMehetGomb(ActionEvent event) { celfelirat.setText("Működik"); } ===== Teljes kód ===== import javafx.application.Application; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.stage.Stage; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Label; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("app.fxml")); Scene scene1 = new Scene(root, 300, 250); primaryStage.setScene(scene1); primaryStage.show(); } @FXML private Label celfelirat; @FXML protected void onClickMehetGomb(ActionEvent event) { celfelirat.setText("Működik"); } }