我想提前道歉,正如前面在“将参数直接从调用者传递给控制器”中讨论的那样,但是我遵循了发现的所有可能的解决方案,但仍然无法使它起作用。
我很难将参数从一个控制器传递到另一个控制器。
特别:
LoginController传递username
给MainController。
当我单击登录按钮LoginController时,将其username
设置为MainController。但是,加载Main.fxml时username
为NULL。
在试图解决这个问题时,我想问一下:
initialize()
方法?我想在LoginController调用的时候st.show();
?username
为NULL,因为我们已经使用Login在LoginController中设置了它的值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)
问题是您致电set的时间username
。
在执行以下语句期间调用的initialize()
方法:MainController
Region root = (Region) loader.load();
Run Code Online (Sandbox Code Playgroud)
此时,username
in中的字段MainController
为null,因此在欢迎消息中将其值报告为null。方法完成setUsername()
后,您将呼叫MainController.initialize()
。
通常,initialize()
用FXML加载器加载的控制器类的方法永远不要尝试对FXML加载器未注入其值的实例字段执行任何操作。这些实例字段在initialize()
调用该方法时尚未初始化。