加载 FXML 时将参数传递到控制器

2022-09-01 15:31:00

我有一个登录屏幕,我想将登录ID从登录控制器传递到主控制器,这样我就可以访问一些功能来更改密码等等。

我像这样加载控制器:

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fxml/Main.fxml"));     

Parent root = (Parent)fxmlLoader.load();          
Scene scene = new Scene(root); 

stage.setScene(scene);    

stage.show();   

Main.fxml 绑定到 MainController.java。有没有办法传递我需要的用户ID,并在控制器的 initialize() 方法上访问它?


答案 1

使用FXMLLoader加载控制器后,可以在调用show()方法之前调用所述控制器的成员。必须获取对刚刚调用的控制器的引用,并从那里调用 set() 方法(或者直接访问属性,如果定义公共)。

从示例中,我们假设与 Main.fxml 关联的控制器称为 MainController,而 MainController 具有 userId 属性,定义为 int。它的 set 方法是 setUser(int user)。因此,从 LoginController 类中:

登录控制器.java:

// User ID acquired from a textbox called txtUserId
int userId = Integer.parseInt(this.txtUserId.getText());

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fxml/Main.fxml"));     

Parent root = (Parent)fxmlLoader.load();          
MainController controller = fxmlLoader.<MainController>getController();
controller.setUser(userId);
Scene scene = new Scene(root); 

stage.setScene(scene);    

stage.show();   

主控制器.java:

public void setUser(int userId){
    this.userId = userId;
}

主控制器.java:

//You may need this also if you're getting null
@FXML private void initialize() {
        
    Platform.runLater(() -> {

        //do stuff

    });
        
}

答案 2