我想提前道歉,正如之前在"Passing Parameters Directly From the Caller to the Controller"中所讨论的那样,但是我遵循了我找到的所有可能的解决方案,但仍然无法使其发挥作用。
我很难将参数从一个控制器传递到另一个控制器。
具体做法是:
LoginController 将username
传递给 MainController 。
当我点击登录按钮 LoginController 时,将username
设置为 MainController 。但是,当加载Main.fxml时username
为NULL。
在试图解决这个问题时,我想问一下:
initialize()
方法被调用时?我想当时 LoginController 调用st.show();
?username
为NULL,因为我们已经使用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();
}
...
}
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);
...
}
...
}
答案 0 :(得分:4)
问题是您致电username
的时间。
initialize()
MainController
方法在执行以下语句时称为:
Region root = (Region) loader.load();
此时,username
中的MainController
字段为空,因此在欢迎消息中将其值报告为null。 setUsername()
方法完成后,您对MainController.initialize()
的调用就会发生。
通常,使用FXML加载器加载的控制器类的initialize()
方法永远不应该尝试对其值尚未由FXML加载器注入的实例字段执行任何操作。在调用initialize()
方法时,这些实例字段尚未初始化。