一、問題
典型的JavaFX程序Main,fxml,Controller 之間的加載關系是這樣的,Main啟動程序,加載fxml,再由 fxml 加載指定的 controller,這個過程是單向的,所以其實 fxml 中並沒法綁定 Main 中的 stage和scene,必須由 Main 加載一個 stage 后,由 fxml 文件對進行初始化設置,所以 fxml 文件不會指定 Stage,Scene,一般由 Main 來指定 Stage 及其對應的 Scene,或者將Main中的Stage對象傳遞給Controller 來進行設置。相應的Scene綁定FXMLLoader讀取到的其他頁面的fxml文件獲取的Root對象,這樣就可以實現在Controller中控制頁面切換邏輯。
但現在我有這樣一個需求,我要將當前窗口的參數傳遞給一個輔助窗口,那該怎么辦?
在stackoverflow上找到了解決方案,這里簡單總結一下。
二、解決方案
@FXML private HBox main;//界面切換的容器 public void show(Customer customer) { FXMLLoader loader = new FXMLLoader(getClass().getResource("test.fxml")); //load必須要先執行,否則下面的controller是null Parent root =loader.load(); TestController controller = loader.getController(); controller.initData("123"); main.getChildren().clear(); main.getChildren().add(root); }
這里將之前加載fxml文件的過程分解了,加載后,通過initData給controller傳遞參數
控件代碼:
public class TestController implements Initializable{ @FXML private Label name; void initialize() {} void initData(String name) { name.setText(name); } }
值得注意的是fxml文件中關聯controller的部分不要做修改。
<?xml version="1.0" encoding="UTF-8"?> <?import java.lang.*?> <?import java.util.*?> <?import javafx.scene.*?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="TestController"> <children> <Label fx:id="name" layoutX="199.0" layoutY="149.0" text="Label" /> </children> </AnchorPane>