У меня есть проект, в котором у меня есть два разных контроллера 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 и сохранить их в переменной?
Заранее спасибо. Если у вас есть какие-либо вопросы о коде, не стесняйтесь спрашивать.

Вы устанавливаете имя пользователя после, метод initialize() выполняется при загрузке документа FXML. Поэтому, когда вы вызываете 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));
Некоторые предположения сделаны, так как ваши образцы кода не полны, но это должно привести вас в правильном направлении.
Большое спасибо Зефир. Раньше я думал, что, поскольку я сначала вызвал метод в другом контроллере, в новом контроллере инициализация будет выполняться после метода. Теперь он работает нормально, и я могу получить переменную.
Сравнение логических значений с
trueилиfalseменя всегда раздражает. тот же результат может быть достигнут с использованием самого (возможно, инвертированного) логического значения:if (cW)