簡體   English   中英

將場景從 FXML 切換到純 JavaFX UI class

[英]Switch scenes from FXML to pure JavaFX UI class

我是 JavaFX 的新手。我已經學會了如何在 FXML 文件或僅用 JavaFX 純編碼的類之間切換場景。 我現在最大的挑戰是在 FXML UI 和另一個內置 JavaFX 之間切換,反之亦然,所以我知道這是可能的,但我就是做不好。 我的應用程序 controller 的代碼是:

package com.example.fxmltojavafx;

import com.sun.javafx.stage.EmbeddedWindow;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.Stage;

import java.net.URL;
import java.util.ResourceBundle;

public class HelloController extends Application {
    @FXML
    private Label welcomeText;


    @FXML
    private Button bt_switch;

    @FXML
    protected void onHelloButtonClick() {

        //switch scene method from fxml to pure javafx
        //bt_switch.setOnAction(e -> window.setScene(InterfaceSwitch));
        welcomeText.setText("Welcome to JavaFX Application!");
    }

    @Override
    public void start(Stage stage) throws Exception {
        bt_switch.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                bt_switch.setOnAction(e -> window.setScene(InterfaceSwitch));
            }
        });
    }
}

我如何引用 JavaFX class 我想通過單擊 fxml 按鈕加載? 我嘗試了 window.setScene(),但它並沒有讓我的參考正確。 當然我不能使用 FMXMLLoader.load()。

我要從這個按鈕加載的場景編碼在這個class中:(編碼到里面的按鈕只是一個測試)

package com.example.fxmltojavafx;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/***
 * Intefaccia puramente in JavaFX
 */
public class InterfaceSwitch extends Application {
    private Stage stage;
    @Override
    public void start(Stage stageInterface) throws Exception {
        VBox parent = new VBox();
        parent.getChildren().add(new Label("SERVER DOMINATOR : Inserisci dati"));
        //setup process
        HBox username = new HBox(new Label("username :")); //username field
        TextField usernametext = new TextField();
        username.getChildren().add(usernametext);
        parent.getChildren().add(username);

        HBox password = new HBox(new Label("password :")); //password field
        TextField passwordtext = new TextField();
        password.getChildren().add(passwordtext);
        parent.getChildren().add(password);

        HBox port = new HBox(new Label("port :")); //port field
        TextField porttext = new TextField();
        port.getChildren().add(porttext);
        parent.getChildren().add(port);

        HBox signupQuest = new HBox(new Label("Set up my game!"));
        parent.getChildren().add(signupQuest);

        Button button1 = new Button("Set up");
        parent.getChildren().add(button1);

        //Scene scene = new Scene(new Label("Server Dominator : Set up"));
        stage.setScene(new Scene(parent));
        stage.show();
    }
}

我的 FXML UI 基本上只有 2 個按鈕,一個用於“hello world”,另一個是 bt_switch

我的總機 class:

package com.example.fxmltojavafx;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;

public class HelloApplication extends Application {
    @Override
    public void start(Stage stage) throws IOException {
        FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
        Scene scene = new Scene(fxmlLoader.load(), 320, 240);
        stage.setTitle("Hello!");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }
}

這一定是一個簡單的設置問題,但我無法理解它。 我該怎么做?

Application class 代表整個應用程序,特別是它的生命周期。 它的目的是通過start()init()stop()等方法管理應用程序的啟動和關閉。 因此,每個應用程序應該只有一個Application子類,並且應該只有一個它的實例(在應用程序啟動時為您創建)。

在您發布的代碼中, HelloApplication代表應用程序生命周期。 HelloController只是一個 controller,不應該是Application的子類。 InterfaceSwitch也不代表應用程序(它只代表一個 UI),因此它不應該是Application的子類。

你應該有類似的東西

public class SomeUI {

    private VBox root ;

    public SomeUI() {
        root = new VBox();
        root.getChildren().add(new Label("SERVER DOMINATOR : Inserisci dati"));
        //setup process
        HBox username = new HBox(new Label("username :")); //username field
        TextField usernametext = new TextField();
        username.getChildren().add(usernametext);
        root.getChildren().add(username);

        HBox password = new HBox(new Label("password :")); //password field
        TextField passwordtext = new TextField();
        password.getChildren().add(passwordtext);
        root.getChildren().add(password);

        HBox port = new HBox(new Label("port :")); //port field
        TextField porttext = new TextField();
        port.getChildren().add(porttext);
        root.getChildren().add(port);

        HBox signupQuest = new HBox(new Label("Set up my game!"));
        root.getChildren().add(signupQuest);

        Button button1 = new Button("Set up");
        root.getChildren().add(button1);

    }

    public Parent getRoot() {
        return root ;
    }
}

由於您說您的 controller 是具有兩個按鈕的 FXML 文件的 controller,因此它需要兩個事件處理程序方法(每個按鈕一個)。 切換場景的按鈕的處理程序只是以正常方式執行此操作。 顯然, controller 不應該是一個Application

public class HelloController  {

   @FXML
   private Label welcomeText;


   @FXML
   protected void onHelloButtonClick() {
       welcomeText.setText("Welcome to JavaFX Application!");
   }

   @FXML
   protected void switchScenes() {
       SomeUI newScene = new SomeUI();
       Parent root = newScene.getRoot();
       welcomeText.getScene().setRoot(root);
   }

}

FXML 看起來像:

<VBox spacing="10" xmlns = "http://javafx.com/javafx/16" xmlns:fx = "http://javafx.com/fxml/1" fx:controller="com.example.HelloController">

    <Label fx:id="welcomeText" />
    <Button text="Say Hello" onAction="#onHelloButtonClick"/>
    <Button text="Switch scenes" onAction="#switchScenes" />

</VBox>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM