Getstylesheets дает nullpointerexception в Javafx, как мне это исправить? - PullRequest
0 голосов
/ 15 мая 2019

Мне хорошо известно, что этот вопрос задавался ранее (несколько раз), но я рассмотрел «решения» того, что смог найти ( добавление файла CSS в таблицы стилей в javafx , Загрузка CSS с использованием исключения нулевого указателя JavaFX в eclipse , Таблица стилей CSS не загружается ), и, похоже, ничего не работает.

Вот строка кода, о которой идет речь:

scene.getStylesheets().add(getClass().getResource("MainMenu.css").toExternalForm()); //this code gives a nullpointerexception

Во всех других моих проектах этот код работал нормально, поэтому я не понимаю, в чем проблема. Единственное различие, о котором я могу думать, состоит в том, что это в git-хранилище.

Чтобы ответить на некоторые вопросы, которые я видел, задали:

Да, я инициализировал сцену, сцена не является проблемой, и программа работает без строки кода выше.

Да, я попытался добавить обратную косую черту перед именем. Не сработало

Да, файл CSS находится в той же папке, что и файл .java

Да, я включил пакет в начало файла .java

Файл имеет чисто имя «MainMenu.css», а не «MainMenu.css.txt» или «MainMenu.css.css»

Не могу понять, в чем проблема. Это опечатка? Я что-то пропустил? Помощь действительно будет оценена.

Если это поможет, я использую Java 8 с Maven через код Visual Studio.

1 Ответ

0 голосов
/ 15 мая 2019

Проблема заключается в getClass(), который разрешает ресурсы относительно пути класса.

Так что getClass().getResource("MainMenu.css") разрешит правильный URL-адрес, только если он находится в том же package dir класса объекта, использующего эту инструкцию.

То есть, если MainMenu.css находится в том же package (каталог) класса MainMenuView, просто используйте MainMenuView.getResource("MainMenu.css"), в противном случае вы всегда можете использовать абсолютные пути, например

getClass().getResource("/org/mycompany/myapp/view/MainMenu.css")

Обновление

Maven также может быть причиной, по которой вы не можете найти свой ресурс файл.

Maven не перемещает ресурсы, помещенные в папку src/main/java, в папку target / classes .

Перемещает ресурсы в папке src/main/resources.

Если у вас стандартная раскладка maven, это может привести к отсутствию ресурсов.

В этом случае вы можете использовать maven-resource-plugin для включения этих ресурсов в вашу сборку.

Например, в одном проекте мне пришлось добавить эту конфигурацию плагина для сборки.

            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.7</version>
                <executions>
                    <execution>
                        <id>copy-fxml-resources</id>
                        <!-- here the phase you need -->
                        <phase>validate</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${basedir}/target/classes/</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>src/main/java/</directory>
                                    <filtering>false</filtering>
                                    <includes>
                                        <include>**/*.fxml</include>
                                        <include>**/*.css</include>
                                    </includes>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

Мне потребовались ресурсы в папке src/main/java, потому что в противном случае Scene Builder не найдет их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...