JavaFX:在控制器之间传递数据总是空的

JavaFX:在控制器之间传递数据总是空的,javafx,Javafx,我想提前道歉,正如前面讨论的,但我遵循了我找到的所有可能的解决方案,但仍然无法让它工作 我很难将参数从一个控制器传递到另一个控制器 具体而言: LoginController将username传递给MainController 当我单击登录按钮时,LoginController将username设置为MainController。但是,加载Main.fxml时,username为空 在试图找出答案时,我想问: 调用MainControllerinitialize()方法时?我想在LoginCon

我想提前道歉,正如前面讨论的,但我遵循了我找到的所有可能的解决方案,但仍然无法让它工作

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

具体而言:

LoginController
username
传递给MainController

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

在试图找出答案时,我想问:

  • 调用MainController
    initialize()
    方法时?我想在LoginController调用
    st.show()时
  • 如果前面的是正确的,那么为什么MainController
    username
    为空,因为我们已经使用
    MainController.setUsername(username)
    LoginController中设置了它的值
  • 任何帮助都将不胜感激

    这是我的密码

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

    问题是您调用set
    username
    的时间

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

    Region root = (Region) loader.load();
    
    此时,
    MainController
    中的
    username
    字段为空,因此其值在欢迎消息中报告为空。对
    setUsername()
    的调用发生在
    MainController.initialize()
    方法完成之后


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

    感谢您的回复。我能想出的唯一解决方案是创建一个新的用户类并在其中存储数据。但是,这对于只存储一个参数来说“太多了”。因此,对于这样的情况,使用静态字段代替?只需将
    setUsername(String usrName)
    更改为调用
    lblWelcomeUser.setText(“欢迎,+usrName”)@James\D这太明显了,我根本看不见!只要一个小小的改变,瞧!我已经试了一整天了。我真的很尴尬。非常感谢你们!如果此答案对您的问题有帮助,请将其作为已接受的答案进行检查。