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

时间:2015-07-11 19:09:14

标签: javafx

我想提前道歉,正如之前在"Passing Parameters Directly From the Caller to the Controller"中所讨论的那样,但是我遵循了我找到的所有可能的解决方案,但仍然无法使其发挥作用。

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

具体做法是:

LoginController username传递给 MainController

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

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

  1. MainController initialize()方法被调用时?我想当时 LoginController 调用st.show();
  2. 如果前一个是正确的,那么为什么 MainController username为NULL,因为我们已经使用mainController.setUsername(username) LoginController 中设置了它的值?
  3. 任何帮助都将不胜感激。

    这是我的代码。

    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();
        }
        ...
    }
    

    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);
            ...
        }
        ...
    }
    

1 个答案:

答案 0 :(得分:4)

问题是您致电username的时间。

initialize() MainController方法在执行以下语句时称为

Region root = (Region) loader.load();

此时,username中的MainController字段为空,因此在欢迎消息中将其值报告为null。 setUsername()方法完成后,您对MainController.initialize()的调用就会发生。

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