JavaFx在不同的fxml文件加載時傳遞參數問題


一、問題

典型的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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM