web-dev-qa-db-ja.com

FXMLを読み込むときにコントローラーにパラメーターを渡す

ログイン画面があり、ログイン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();   

Main.fxmlはMainController.Javaにバインドされています。必要なユーザーIDを渡し、コントローラーのinitialize()メソッドでアクセスする方法はありますか?

20
Dynelight

FXMLLoaderでコントローラーをロードした後、show()メソッドが呼び出される前に、そのコントローラーのメンバーを呼び出すことができます。呼び出されたばかりのコントローラーへの参照を取得し、そこからset()メソッドを呼び出す(またはパブリックに定義されている場合は属性に直接アクセスする)必要があります。

この例から、Main.fxmlに関連付けられたコントローラーはMainControllerと呼ばれ、MainControllerにはintとして定義されたuser_id属性があるとします。その設定メソッドは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();   

MainController.Java:

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

MainController.Java:

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

    Platform.runLater(() -> {

        //do stuff

    });

}
39
Dynelight