Как ссылаться на файлы 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 в соответствующий каталог папки основных ресурсов:
но у меня все еще есть ошибка.
3 ответов
использование
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/main.fxml"));
Parent content = loader.load();
расположение разрешение
-
Поместите все ваши fxml в каталог src/main/resources.
loader.setLocation(getClass().getResource("/main.fxml"));
-
Поместите все ваши fxml в каталог src/main/resources/fxml.
loader.setLocation(getClass().getResource("/fxml/main.fxml"));
-
поместите fxml в соответствующий каталог ресурсов; например, src/main/resources/com/mycompany / myapp.
loader.setLocation(getClass().getResource("main.fxml"));
последний параметр предполагает, что класс, из которого вы загружаете fxml, находится в том же относительном расположении в соответствующей исходной иерархии Java. Например, можно вызвать последнюю команду load из source com.mycompany.myapp.Main.java
.
рекомендации по использованию FXMLLoader
-
создайте экземпляр FXMLLoader через
new FXMLLoader()
вместо использования the статические методы на FXMLLoader.- статические методы становится запутанным, когда вы хотите получить значения (как инстанцировали контроллеры) из загрузчика.
-
установить местоположение на экземпляре FXMLLoader и вызов
load()
вместо загрузки из потока с помощьюload(stream)
.- установка URL-адреса на основе местоположения загрузчика позволяет разрешить относительные ресурсы загружается в файлы fxml и css. Родственник ресурсы не разрешаются для конструктора на основе потока.
чтобы получить местоположение на основе класса, используйте
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.