Как ссылаться на файлы javafx fxml в папке ресурсов?

Я создаю приложение JavaFX GUI, и мой проект-это проект, настроенный maven. Я хочу иметь возможность ссылаться на мои файлы fxml, как это в моих контроллерах:

FXMLLoader.load(getClass().getResource("main.fxml"); 

где моя главная.файл fxml находится в папке src/main/resources, а мой контроллер-в папке src/main/java. Как мне это сделать? Моя папка src/main/resources находится в пути сборки, и я могу вызвать a .файл свойств, который находится в папке src/main/resources из класса в папка src/main/java.

редактировать

Я попытался поместить файл fxml в соответствующий каталог папки основных ресурсов:

enter image description here

но у меня все еще есть ошибка.

3 ответов


использование

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/main.fxml"));
Parent content = loader.load(); 

расположение разрешение

  1. Поместите все ваши fxml в каталог src/main/resources.

    loader.setLocation(getClass().getResource("/main.fxml"));
    
  2. Поместите все ваши fxml в каталог src/main/resources/fxml.

    loader.setLocation(getClass().getResource("/fxml/main.fxml"));
    
  3. поместите fxml в соответствующий каталог ресурсов; например, src/main/resources/com/mycompany / myapp.

    loader.setLocation(getClass().getResource("main.fxml")); 
    

последний параметр предполагает, что класс, из которого вы загружаете fxml, находится в том же относительном расположении в соответствующей исходной иерархии Java. Например, можно вызвать последнюю команду load из source com.mycompany.myapp.Main.java.

рекомендации по использованию FXMLLoader

  1. создайте экземпляр FXMLLoader через new FXMLLoader() вместо использования the статические методы на FXMLLoader.

    • статические методы становится запутанным, когда вы хотите получить значения (как инстанцировали контроллеры) из загрузчика.
  2. установить местоположение на экземпляре FXMLLoader и вызов load() вместо загрузки из потока с помощью load(stream).

    • установка URL-адреса на основе местоположения загрузчика позволяет разрешить относительные ресурсы загружается в файлы fxml и css. Родственник ресурсы не разрешаются для конструктора на основе потока.
  3. чтобы получить местоположение на основе класса, используйте getClass().getResource(), поскольку он основан на URL, а не getClass().getResourceAsStream() который основан на потоке.

IDE и настройки сборки

убедитесь, что среда IDE или инструмент сборки копирует файлы fxml из каталога ресурсов в сборку выходной каталог. Для понимания настроек Intellij для этого см.:как преобразовать обычный проект java в intellij в проект JavaFx.


вы используете FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("main.fxml") ); для загрузки основной.FXML-файл. Для этого требуется основное.fxml и класс java загружают его в тот же каталог/путь. Если вы хотите загрузить файл fxml из пути / местоположения, отличного от загружаемого класса java, вам нужно использовать относительный путь. Как @jewelsea упоминалось выше, вы можете использовать относительный путь, используя / символ перед вашим основным.FXML-файл. Таким образом, код, который заставит его работать для вас в вашем случае, -

FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("/main.fxml") );

откройте папку resources в проводнике вашей операционной системы. Здесь вы увидите, что создали "Доминион".папка " приложение "вместо папки" приложение "внутри папки" Доминион". Из-за этого класс" MainController " помещается в другой пакет в качестве файла fxml.