JavaFX:在控制器之间传递数据始终为null

Joh*_*dis 3 javafx

我想提前道歉,正如前面在“将参数直接从调用者传递给控制器​​”中讨论的那样,但是我遵循了发现的所有可能的解决方案,但仍然无法使它起作用。

我很难将参数从一个控制器传递到另一个控制器。

特别:

LoginController传递usernameMainController

当我单击登录按钮LoginController时,将其username设置为MainController。但是,加载Main.fxml时username为NULL。

在试图解决这个问题时,我想问一下:

  1. 什么时候调用MainController initialize()方法?我想在LoginController调用的时候st.show();
  2. 如果前一个是正确的,那么为什么MainController username为NULL,因为我们已经使用LoginLoginController中设置了它的值mainController.setUsername(username)

任何帮助,将不胜感激。

这是我的代码。

LoginController.java

public class LoginController implements Initializable {
    ...
    @FXML TextField username;

    @FXML public void actionLoginButton() {
        ...
        Stage st = new Stage();
        FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml"));
        Region root = (Region) loader.load();

        Scene scene = new Scene(root);
        st.setScene(scene);

        MainController mainController = loader.<MainController>getController();
        mainController.setUsername(username.getText());

        st.show();
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

MainController.java

public class MainController implements Initializable {
    ...
    String username;

    @FXML Label lblWelcomeUser;

    public void setUsername(String usrname) {
        this.username = usrname;
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        ...    
        lblWelcomeUser.setText("Welcome, " + this.username);
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

sco*_*ttb 5

问题是您致电set的时间username

执行以下语句期间调用的initialize()方法:MainController

Region root = (Region) loader.load();
Run Code Online (Sandbox Code Playgroud)

此时,usernamein中的字段MainController为null,因此在欢迎消息中将其值报告为null。方法完成setUsername()后,您将呼叫MainController.initialize()

通常,initialize()用FXML加载器加载的控制器类的方法永远不要尝试对FXML加载器未注入其值的实例字段执行任何操作。这些实例字段在initialize()调用该方法时尚未初始化。