我很清楚这个问题以前(几次)曾被问过,但是我已经对我能找到的解决方案(adding css file to stylesheets in javafx,Loading 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结合使用。
答案 0 :(得分:0)
问题出在getClass()
上,它可以解析相对于该类的 path 的资源。
因此,getClass().getResource("MainMenu.css")
仅在与使用该指令的对象的类的包目录相同时才会解析为正确的URL。
因此,如果MainMenu.css
与MainMenuView
类位于同一 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
文件夹中的资源,因为否则场景构建器将找不到它们。