Загрузка контроллера JavaFX

Я пару раз сталкивался с каким-то очень странным поведением, каждый раз забывая трюк.

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("view/window.fxml"));
Parent root = loader.load();
GuiController controller = loader.getController();

Теперь controller не равно нулю.

Однако после того, как я это сделаю...

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("view/window.fxml"));
Parent root = loader.load(getClass().getResource("view/window.fxml"));
GuiController controller = loader.getController();

controller теперь null.

Я так понимаю, что loader как-то теряет хватку на локации? Я был бы очень признателен, если бы кто-нибудь сказал мне, что это ожидаемое поведение, и объяснил мне, почему.

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


person ZbyszekKr    schedule 12.11.2015    source источник
comment
Вероятно, вы имеете в виду loader, а не fxmlLoader в обоих обращениях к setLocation(...).   -  person James_D    schedule 13.11.2015


Ответы (1)


Метод FXMLLoader load(URL) — это метод static. Таким образом, ваш второй блок кода эквивалентен (компилируется)

FXMLLoader loader = new FXMLLoader();
// I assume you mean loader, not fxmlLoader, in the next line:
loader.setLocation(getClass().getResource("view/window.fxml"));
Parent root = FXMLLoader.load(getClass().getResource("view/window.fxml"));
GuiController controller = loader.getController();

Другими словами, вы никогда не вызываете load(...) для loader: следовательно, loader никогда не анализирует FXML и не создает экземпляр контроллера.

В первом блоке кода вы вызываете без аргументов load(), который является методом экземпляра.

person James_D    schedule 12.11.2015
comment
Не заметил ключевое слово static в документации. Большое спасибо. :) Потерял из-за этого довольно много вечера. - person ZbyszekKr; 13.11.2015
comment
По какой-то причине мое предупреждение для этого класса было подавлено... После того, как я снова включил их, оно сработало так, как вы сказали. Спасибо. - person ZbyszekKr; 13.11.2015
comment
Большинство IDE дадут вам предупреждение, если вы вызовете статический метод из ссылки. - person James_D; 13.11.2015