it-swarm.com.ru

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

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

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

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

Правка

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

enter image description here

но я все еще получил ошибку.

24
j will

Пример использования

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/основные/ресурсы/ком/MyCompany/MYAPP. 

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

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

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

  1. Создание экземпляра FXMLLoader с помощью new FXMLLoader() вместо использования статических методов в FXMLLoader

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

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

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

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

78
jewelsea

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

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

Откройте папку ресурсов в проводнике вашей операционной системы. Здесь вы увидите, что вы создали папку «dominion.application» вместо папки «application» внутри папки «dominion». Из-за этого класс «MainController» помещается в другой пакет, как файл fxml.

0
Hendrik Ebbers