Felhasználói eszközök

Eszközök a webhelyen


oktatas:programozas:java:java_fx:scenebuilder

< Java FX

Scene Builder

A SceneBuilder beszerzése

Ez csak a régi Java 8-hoz van:

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

Használat

Készítsünk egy állományt, például:

mainScene.fxml

vagy:

app.fxml

Az állományon jobb egér gomb, majd:

  • Open in Scene Builder

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.

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

App.java
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");
    }
}
app.fxml
<?xml version="1.0" encoding="UTF-8"?>
 
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
 
<VBox alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="App">
   <children>
      <Label fx:id="celfelirat" text="Első Scene Builder" />
      <Button mnemonicParsing="false" onAction="#onClickMehetGomb" text="Mehet" />
   </children>
</VBox>

MVC

Adott egy projekt, ahol a kontroller külön osztályban van. A következő fájl és könyvtárszerkezet van:

app01/
  |-lib/
  |-src/
  |  |-controllers/
  |  |  `-MainController.java
  |  |-models/
  |  |  `-MainModel.java
  |  |-views/
  |  |  `-MainScene.fxml
  |  `-App.java
  `-README.md

A kontroller a controllers/MainController.java fájlban van. A nézet a mainScene.fxml fájlban.

Mivel írni akarjuk a TextField mezőt, adnunk kell egy fx:id azonosítót:

Megmondjuk a kontroller osztály nevét:

controllers/MainController.java
package controllers;
 
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.TextField;
import models.MainModel;
 
public class MainController {
    MainModel mainModel;
 
    @FXML
    private TextField textfield1;
 
    public MainController() {
        this.mainModel = new MainModel();
    }
 
    @FXML
    protected void onClickMehetGomb(ActionEvent event) {
        System.out.println("Működik");
        Integer num = this.mainModel.getNum();
        textfield1.setText(num.toString());
    }
 
}
models/MainModel.java
package models;
 
public class MainModel {
    public int getNum() {
        return 15;
    }    
}
views/MainScene.fxml
<?xml version="1.0" encoding="UTF-8"?>
 
<?import javafx.scene.layout.*?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
 
 
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controllers.MainController">
   <children>
      <Label text="Label" />
      <TextField fx:id="textfield1" />
      <Button mnemonicParsing="false" onAction="#onClickMehetGomb" text="Button" />
   </children>
</VBox>
App.java
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 {
    public static void main(String[] args)  throws Exception  {
        launch(args);
    }
    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("views/MainScene.fxml"));
        Scene scene1 = new Scene(root, 300, 250);
        primaryStage.setScene(scene1);
        primaryStage.show();
    }
 
}

Példa GitHubon

oktatas/programozas/java/java_fx/scenebuilder.txt · Utolsó módosítás: 2024/02/14 20:00 szerkesztette: admin