IntelliJ IDEA - getClass(). GetResource ( "..." ) возвращает null

Я использую IntelliJ IDEA 13.1.5, я работал с Eclipse. Я работаю над приложением JavaFX, я пытаюсь загрузить файл FXML в моем классе MainApp, используя getClass(). GetResource(). Я прочитал документацию, и я попробую несколько идей, в конце у меня null.

Это иерархия:

dz.bilaldjago.homekode.MainApp.java

dz.bilaldjago.homekode.view.RootLayout.FXML

Это фрагмент кода, который я использовал:

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("view/RootLayout.fxml"));

Я пробовал другое решение, такое как указание url из корня и использование classLoader

результат тот же. Любая идея, пожалуйста,

Ответ 1

Я решил эту проблему, указав resource root на IDEA.

Right click в каталоге (или просто имени проекта) → Mark directory Asresource root.

Перекомпилируйте и радуйтесь: P Надейтесь, что это сработает для вас ~

Ответ 2

Для тех, кто использует Intellij Idea: проверьте Settings -> Compiler -> Resource patterns.

Параметр содержит все расширения, которые должны интерпретироваться как ресурсы. Если расширение не соответствует какому-либо шаблону здесь, class.getResource будет возвращать null для ресурсов, используя это расширение.

Ответ 3

Если ваш проект является проектом maven, проверьте целевой код, чтобы увидеть, существует ли там файл .fxml. если его там нет, просто добавьте

<resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>

в вашем pom.xml

Ответ 4

TL; DR;

  1. Поместите свои ресурсы в папку resources.

  2. Используйте их с одной косой чертой перед их именами: getClass().getResource("/myfont.ttf");

Длинная история;

Если вы используете Intellij IDEA и создали проект Maven, вы должны поместить свои ресурсы в папку resources (помеченную как корень ресурса самим intellij), и эти ресурсы перейдут в корень скомпилированного приложения.

Я имею в виду, /resources/myfont.ttf перейдет к /myfont.ttf в итоговой сборке.

Так что вы должны получить его через /myfont.ttf, а не myfont.ttf. Используйте это так:

getClass().getResource("/myfont.ttf");

Не нужно ничего менять. Просто этот мне помог.

Ответ 5

Я сдался, пытаясь использовать getClass().getResource("BookingForm.css"));

Вместо этого я создаю объект File, создаю URL-адрес из этого объекта, а затем передаю его в getStyleSheets() или setLocation() File file = new File(System.getProperty("user.dir").toString() + "/src/main/resources/BookingForm.css");

scene.getStylesheets().add(folder.toURI().toURL().toExternalForm());

Ответ 6

Windows чувствительна к регистру, а остальная часть мира - нет. Также исполняемый java jar (zip-формат) имена ресурсов чувствительны к регистру.

Лучше всего переименуйте файл

view/RootLayout.FXML

к

view/RootLayout.FXML

Это нужно сделать, перемещая исходный файл и создавая новый.

Также скомпилируйте банку и проверьте, что файл fxml был добавлен в jar (zip файл). Когда не пройден путь к ресурсам IntelliJ другим способом.

Кстати, это путь относительно пути пакета getClass(). Имейте в виду, что если вы расширили этот класс, измените полный путь, лучше используйте:

MainApp.class.getResource("view/RootLayout.fxml")