Как сказать IntelliJ получить контроллер FXML от FXMLLoader для подсветки синтаксиса?

В моем проекте JavaFX выполняются следующие шаги: Вычислить оптимальные значения в Model классе инициализировать Controller создать новый экземпляр FXMLLoader установить Controller и view.fxml визуализировать представление

В моем файле fxml нет такой строки, как fx:controller="com.example.Controller". IntelliJ не может разрешить такие методы, как onMouseClicked="#processMyButtonClick", потому что не знает, какой контроллер использовать. No Controller specified for top level element. Есть ли способ сообщить IntelliJ. Если контроллер указан в FXML, Java выдает исключение Controller value already specified.

В результате журналы системы контроля версий засоряются ложными срабатываниями «Обнаружено 100 ошибок», а связь между #methodName в fxml и public void methodName(){/*..*/} перестает работать.

Есть ли способ сообщить IntelliJ, чтобы получить контроллер fxml из класса POJO?


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


person Stepan    schedule 07.09.2017    source источник
comment
Вероятно, это не то, что вы хотите, но можно указать fx:controller и инициализировать контроллер перед инициализацией контроллера до того, как что-либо будет введено в него с помощью controllerFactory.   -  person fabian    schedule 07.09.2017
comment
Почему вы не хотите включать контроллер в файл FXML?   -  person Przemysław Tamoń    schedule 08.09.2017


Ответы (1)


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

public static Node loadScene(Controller c) {
    URL resource = Controller.class.getResource("/scene.fxml");
    FXMLLoader loader = new FXMLLoader(resource);
    loader.setControllerFactory(param -> c);
    loader.load();
    return loader.getRoot();
}
person findusl    schedule 13.09.2017
comment
Минимально инвазивная процедура. Спасибо. - person Stepan; 13.09.2017