我有一个项目,其中有两个不同的控制器adminUserList和editStaffController,adminUserStaff将字符串传递给editStaffController。
public void openStaffEdit(ActionEvent actionEvent, String form, boolean cW){
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/home/editStaff.fxml"));
Parent root = (Parent) loader.load();
editStaffController eS = loader.getController();
eS.setUsername(itemname);
Stage stage = new Stage();
stage.setScene(new Scene(root));
stage.show();
stage.show();
// Hide this current window (if this is what you want)
if(cW == true){
((Node)(actionEvent.getSource())).getScene().getWindow().hide();
}
}
catch (IOException e) {
e.printStackTrace();
}
}
,当它接收到字符串时,将其设置在标签和字段中
public void setUsername(String editUsername){
username_lb.setText(editUsername);
username_field.setText(editUsername);
}
,当我运行它时它会正确显示在程序中。
但是,当我尝试在初始化中获取数据时,即使程序在字段中显示它,也很难返回空值。
@Override
public void initialize(URL location, ResourceBundle resources) {
position_Box.getItems().addAll("Franchise", "Receptionist" , "Mechanic", "Foreperson");
info_txt.setVisible(false);
System.out.println(username_field.getText());
setFields();
}
是否可以解决此问题?是否有更好的方法将数据从adminUserListController传递到editStaffController并将其保存在变量中?
先谢谢了。如果您对代码有任何疑问,请随时提问。
答案 0 :(得分:3)
要在加载FXML文档时执行initialize()
方法之后,在 之后设置用户名。因此,当您致电username_field.getText()
时,它为空为空。
请记住,当界面显示在屏幕上时,控制器的构造函数和initialize()
方法已经完全完成运行。
您发布的代码没有包含足够的信息来了解您要完成的任务,但是通常不应尝试从initialize()
方法内的节点检索数据。如果您需要访问initialize()
方法中的用户名,请在控制器中声明一个类字段,该字段可由构造函数设置:
private String username;
public YourController(String username) {
this.username = username;
}
现在,您只需要在Java代码而不是FXML文档中声明控制程序,并将用户名作为参数传递即可:
FXMLLoader loader = new FXMLLoader(getClass().getResource("/home/editStaff.fxml"));
loader.setController(new YourController(username));
由于您的代码示例不完整,因此做出了一些假设,但这应该引导您朝着正确的方向前进。