Ответ 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.