JavaFX label.getText() ничего не возвращает

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

Заранее спасибо. Если у вас есть какие-либо вопросы о коде, не стесняйтесь спрашивать.

Сравнение логических значений с true или false меня всегда раздражает. тот же результат может быть достигнут с использованием самого (возможно, инвертированного) логического значения: if (cW)

fabian 29.03.2019 05:34
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
0
1
252
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы устанавливаете имя пользователя после, метод 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));

Некоторые предположения сделаны, так как ваши образцы кода не полны, но это должно привести вас в правильном направлении.

Большое спасибо Зефир. Раньше я думал, что, поскольку я сначала вызвал метод в другом контроллере, в новом контроллере инициализация будет выполняться после метода. Теперь он работает нормально, и я могу получить переменную.

Mahedi Hasan 29.03.2019 11:04

Другие вопросы по теме