FXMLLoader не может найти работающий экземпляр контроллера и создает новый

Я новичок, когда дело доходит до JavaFX, и недавно я столкнулся с проблемой, которая меня очень смущает. Я использую класс под названием «MainController», который управляет FXML-файлом, содержащим TabPane. Каждая вкладка управляется другим контроллером. Но есть одна ситуация, когда вкладку необходимо удалить, поэтому мне нужен доступ к экземпляру MainController, чтобы удалить текущую активную вкладку с панели.

Всякий раз, когда я использую этот код для получения экземпляра работающего в данный момент MainController, вместо этого я получаю совершенно новый экземпляр со всеми его компонентами, установленными на значения по умолчанию.

Код:

FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml"));
loader.load();
MainController controller = loader.getController();
controller.closeCurrentTab();

 

protected void closeCurrentTab() {
    tabPane.getTabs().remove(tabPane.getSelectionModel().getSelectedIndex());
}

В настоящее время я использую статическую ссылку на контроллер для доступа к нему, поскольку это единственное решение, которое работает для меня. Но я знаю, что это крайне непрофессионально, и я действительно хочу этого избежать.

Надеюсь, кто-нибудь знает, что здесь не так.


person Geta92    schedule 13.05.2016    source источник


Ответы (1)


Вы должны убедиться, что у вас есть ссылка на ваш основной контроллер в том месте, где вы хотите его использовать. Я предполагаю, что это один из «дочерних» контроллеров (скорее всего, контроллер текущей вкладки).

Поэтому, если бы у вас было свойство в этом классе, в котором хранится ссылка на ваш основной контроллер, ваша проблема была бы решена.

Я предполагаю, что вы инициализируете этот «дочерний» контроллер от основного контроллера, например:

FXMLLoader loader = new FXMLLoader(getClass().getResource("TabController1.fxml"));
loader.load();

Итак, здесь вы можете сделать:

TabController controller = loader.getController();
controller.mainControllerProperty.set(this);

Где mainControllerProperty определяется в TabController как:

ObjectProperty<MainController> mainControllerProperty = new SimpleObjectProperty();
person DVarga    schedule 13.05.2016
comment
Большое спасибо! Это сработало очень хорошо для моих вкладок. У меня проблема только в том случае, если я хочу сделать то же самое при создании нового окна. Попытка получить доступ к контроллеру всегда будет приводить к исключению nullPointerException. Я добавляю новый ответ, когда немного лучше понимаю ошибку. - person Geta92; 13.05.2016
comment
Если бы ответ решил вашу проблему, могли бы вы принять его и проголосовать за него? Это закроет этот вопрос - тогда вы можете создать еще один для другой проблемы. Это делает вопрос ясным. Спасибо :) - person DVarga; 13.05.2016
comment
Оказывается, проблема в том, что мне нужно получить доступ к контроллеру внутри метода initialize(), но в этот момент он все равно будет нулевым, поскольку ссылку можно добавить только после этого. РЕДАКТИРОВАТЬ: Решил это сам. Спасибо ;) - person Geta92; 13.05.2016