Подтвердить что ты не робот

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

Я создаю приложение GUI для 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.

Edit

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

enter image description here

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

4b9b3361

Ответ 1

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

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

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

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

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

  • Создайте экземпляр FXMLLoader через new FXMLLoader(), а не используйте статические методы на FXMLLoader.

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

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

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

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

Ответ 2

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

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

Ответ 3

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