web-dev-qa-db-fra.com

Passer des paramètres à un contrôleur lors du chargement d'un FXML

J'ai un écran de connexion et je veux transmettre l'ID de connexion du LoginController au MainController, afin que je puisse accéder à certaines fonctions pour changer le mot de passe et ainsi de suite.

Je charge le contrôleur comme ceci:

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 est lié à MainController.Java. Existe-t-il un moyen de transmettre l'ID utilisateur dont j'ai besoin et d'y accéder via la méthode initialize () du contrôleur?

20
Dynelight

Après avoir chargé le contrôleur avec FXMLLoader, il est possible d'appeler des membres dudit contrôleur avant que la méthode show () soit invoquée. Il faut obtenir la référence au contrôleur qui vient d'être invoqué et appeler une méthode set () à partir de là (ou accéder directement à l'attribut, s'il est défini public).

À partir de l'exemple, supposons que le contrôleur associé à Main.fxml s'appelle MainController, et MainController a un attribut user_id, défini comme un int. Sa méthode set est setUser (int user). Ainsi, à partir de la classe 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