Getstylesheets在Javafx中提供了nullpointerexception,如何解决此问题?

时间:2019-05-15 07:39:22

标签: java css javafx

我很清楚这个问题以前(几次)曾被问过,但是我已经对我能找到的解决方案(adding css file to stylesheets in javafxLoading css using JavaFX null pointer exception in eclipse,{{3} }),似乎没有任何效果。

以下是有问题的代码行:

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”

我一生无法理解问题所在。是错字吗?我错过了什么?帮助将不胜感激。

如果有帮助,我将通过Visual Studio Code将Java 8与Maven结合使用。

1 个答案:

答案 0 :(得分:0)

问题出在getClass()上,它可以解析相对于该类的 path 的资源。

因此,getClass().getResource("MainMenu.css")仅在与使用该指令的对象的类的包目录相同时才会解析为正确的URL。

因此,如果MainMenu.cssMainMenuView类位于同一 package (目录)中,则只需使用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文件夹中的资源,因为否则场景构建器将找不到它们。