Доступ к элементам загруженного 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 ответ:
Я не вижу никакой причины, по которой ваш подход не работает; я высмеял что-то подобное, и это сработало просто отлично. Однако это необычный подход, поскольку вы используете один и тот же объект в качестве контроллера для двух отдельных файлов 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"