Документ FXML с неизвестным путем

Мы пишем приложение Java с использованием JavaFX. На данный момент у нас есть 3 разные формы:

  • Авторизоваться
  • Окно игры
  • Регистрация

Для нашей следующей итерации мы хотим реализовать форму регистрации, но получаем ошибку IOException Unknown Path

Речь идет об этом фрагменте кода:

FXMLLoader registrationLoader = new FXMLLoader();
                    try{
                        mainroot = (Parent)registrationLoader.load(this.getClass().getResource("FXMLRegistration.fxml").openStream());                            
                        Stage registrationStage = new Stage();
                        Scene scene = new Scene(mainroot);
                        registrationStage.setScene(scene);
                        registrationStage.setTitle("Register your account");
                        registrationStage.show();
                    } catch(IOException ex)
                    {
                        System.out.print(ex.getMessage());
                    }

Приведенный выше код работает, когда я меняю FXMLRegistration.fxml на FXMLDocument.fxml или FXMLLoader.fxml.

Когда я меняюсь

mainroot = (Parent)registrationLoader.load(this.getClass().getResource("FXMLRegistration.fxml").openStream());

to

mainroot = (Parent)registrationLoader.load(Paths.get("src/hackattackfx/FXMLRegistration.fxml").toUri().toURL());

источник

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

Я надеюсь, что кто-то может помочь нам с этой ошибкой.

Заранее спасибо!

ИЗМЕНИТЬ

Я изменил некоторый код на следующее:

FXMLLoader registrationLoader = new FXMLLoader(getClass().getResource("/FXMLRegistration.fxml"));
mainroot = (Parent)registrationLoader.load();   

но это вернет исключение IllegalStateException: местоположение не установлено. Когда я удаляю / перед /FXMLRegistration.fxml, я получаю свой блок catch, печатающий полный путь к файлу:

файл:/Users/juleskreutzer/Documents/github/PTS3/HackAttackFX/dist/run1793658053/HackAttackFX.jar!/hackattackfx/FXMLRegistration.fxml

Также изменение пути на src/hackattackfx/FXMLRegistration.fxml приведет к исключению IllegalStateException: Location not set.

Структура проекта

Мы используем разные пакеты в нашем приложении. все эти пакеты находятся в пакете по умолчанию: hackattackfx

Пакеты в пакете по умолчанию:

  • Default Package
    • Exceptions
    • Интерфейсы
    • перечисления
    • Ресурсы
    • Шаблоны
  • Пакет JSON

Мои документы FXML находятся в пакете по умолчанию (hackattackfx). Если не совсем понятно, как я упорядочил свои файлы, взгляните на мой репозиторий на Github


person Jules    schedule 09.11.2015    source источник
comment
Ваш вопрос не очень ясен (мне). Когда вы используете Paths.get("src/hackattackfx/FXMLRegistration.fxml").toUri().toURL(), это работает? Вы собираетесь использовать Paths.get() ? Если да, то почему?   -  person ItachiUchiha    schedule 09.11.2015
comment
Paths.get() не работает, он печатает путь к моему отладчику, поэтому он должен попасть в мой блок catch. Если возможно, я хочу использовать getClass().getResource(X).openStream()   -  person Jules    schedule 09.11.2015
comment
Вы должны использовать getClass().getResource(), если ваш файл присутствует в пути к классам. Paths.get() не имеет смысла в таких обстоятельствах.   -  person ItachiUchiha    schedule 09.11.2015
comment
Когда я использую getClass().getResource(), путь также печатается, но это ../HackAttack.jar!/hackattackfx/FXMLRegistration.fxml. Я не могу найти этот путь в терминале, я думаю, потому что !   -  person Jules    schedule 09.11.2015


Ответы (2)


Итак, мне стало любопытно узнать основную причину, я клонировал репозиторий и обнаружил, что фактическая проблема заключалась в следующей ошибке и той, которая была опубликована ОП в вопросе

Вызвано: java.lang.NullPointerException в hackattackfx.FXMLRegistrationController.initialize(FXMLRegistrationController.java:67)

Это означает, что в контроллере pane было null.

Это произошло потому, что в fxml отсутствовало объявление fx:id .

Добавьте fx:id="pane" к объявлению AnchorPane FXMLRegistration.fxml, и все должно работать нормально.

person ItachiUchiha    schedule 09.11.2015
comment
Спасибо за помощь. Я попробую, когда вернусь за свой стол, и дам вам знать, если это сработало! - person Jules; 09.11.2015
comment
Извините, но ваши ответы мне не подходят. Я отредактировал свой вопрос с результатами после того, как попробовал ваш ответ. - person Jules; 10.11.2015
comment
Можете ли вы добавить структуру проекта к вопросу? - person ItachiUchiha; 10.11.2015

Вам нужно начать свой Путь с /

это работает для меня:

final String fxmlPath = "/fxml/Main.fxml";
final FXMLLoader loader = new FXMLLoader(this.getClass().getResource(fxmlPath));

Main.fxml находится в папке ресурсов (у меня: /src/main/resources/fxml/)

person Tobi    schedule 09.11.2015