Доступ к элементам загруженного FXML в Родительском контроллере


В настоящее время у меня есть следующая ситуация:

Я создал файл FXML, поддержанный контроллером FXML. Экран состоит из боковой панели и держателя для детей. Когда я нажимаю на элемент в боковой панели, я загружаю дополнительный файл FXML в дочерний держатель, например:

childHolder.getChildren().addAll(FXMLLoader.load(getClass().getResource("SidebarItem1.fxml")));

Это прекрасно работает. Но я хочу получить доступ к некоторым элементам загруженного FXML в контроллере родительского контроллера. Я просто инициализировать элементы ребенка FXML-файл после того, как я загрузил ее.

I уже смотрел на этот вопрос: JAVAFX - FXML-Access загруженные элементы управления FXML из родительского контроллера, но когда я делаю это так, я все равно получаю ошибку:

FXMLLoader loader = new FXMLLoader(getClass().getResource("SidebarItem1.fxml"));
loader.setController(this);
childHolder.getChildren().addAll(loader.load());

someChildTextField.setText("Some text");

Я дал someChildTextField a fx:id и поместил его поверх инициализации следующим образом:

@FXML public TextField someChildTextField;

Тем не менее, я получаю NullpointerException, поэтому я предполагаю, что он все еще не может найти элемент управления.

Кто-нибудь знает, как получить доступ к элементам загруженного FXML в Родительском контроллере?

1 2

1 ответ:

Я не вижу никакой причины, по которой ваш подход не работает; я высмеял что-то подобное, и это сработало просто отлично. Однако это необычный подход, поскольку вы используете один и тот же объект в качестве контроллера для двух отдельных файлов FXML.

Я бы рекомендовал использовать один контроллер для каждого FXML. Так что вы могли бы сделать что-то вроде

public class SidebarItem1Controller {

    @FXML
    private TextField someTextField ;

    public void setText(String text) {
        someTextField.setText(text);
    }

}

А затем от вашего родительского контроллера просто сделайте

FXMLLoader loader = new FXMLLoader(getClass().getResource("SidebarItem1.fxml"));
childHolder.getChildren().add(loader.load());
SideBarItem1Controller childController = loader.getController();
childController.setText("Some Text");

Установите контроллер в свой SideBarItem1.FXML файл обычным способом, с fx:controller = com.example.SidebarItem1Controller"