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

Dyn*_*ght 21 java parameter-passing javafx-2

我有一个登录屏幕,我想将登录ID从LoginController传递给MainController,所以我可以访问一些函数来更改密码等等.

我像这样加载控制器:

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

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

stage.setScene(scene);    

stage.show();   
Run Code Online (Sandbox Code Playgroud)

Main.fxml受限于MainController.java.有没有办法可以传递我需要的用户ID,并在控制器的initialize()方法上访问它?

Dyn*_*ght 40

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

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

LoginController.java:

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

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

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

stage.setScene(scene);    

stage.show();   
Run Code Online (Sandbox Code Playgroud)

MainController.java:

public void setUser(int user_id){
    this.user_id = user_id;
}
Run Code Online (Sandbox Code Playgroud)

MainController.java:

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

    Platform.runLater(() -> {

        //do stuff

    });

}
Run Code Online (Sandbox Code Playgroud)

  • 这实际上有用吗?我的user_id总是为null. (11认同)
  • @RicardoGonzales在调用controller的initialize()方法之后传递数据.如果在initialize方法之后检查,则可以看到变量. (2认同)