我正在使用IntelliJ IDEA 13.1.5,我曾经使用Eclipse。我正在研究JavaFX应用程序,我尝试使用getClass()。getResource()在我的MainApp类中加载FXML文件。 我阅读了文档并尝试了几个想法,最后我有 null 。
这是层次结构:
dz.bilaldjago.homekode.MainApp.java
dz.bilaldjago.homekode.view.RootLayout.FXML
这是我使用的代码段:
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("view/RootLayout.fxml"));
我尝试了其他解决方案,例如从root用户提供url并使用classLoader
结果是一样的。请知道
答案 0 :(得分:17)
我通过在IDEA上指出resource root
解决了这个问题。
Right click
(或只是项目名称) - > Mark directory As
- > Resource Root
。
重新编译&高兴:P希望这对你有用〜
答案 1 :(得分:16)
对于那些使用Intellij Idea的人:检查Settings -> Compiler -> Resource patterns
。
该设置包含应解释为资源的所有扩展名。如果扩展不符合此处的任何模式,则class.getResource将使用此扩展为资源返回null。
答案 2 :(得分:2)
如果您的项目是maven项目,请检查目标代码以查看您的.fxml文件是否存在。如果它不存在,只需添加
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
pom.xml中的
答案 3 :(得分:1)
将资源放入resources
文件夹中。
在其名称前使用一个斜杠:getClass().getResource("/myfont.ttf");
如果您正在使用Intellij IDEA
并创建了一个Maven
项目,则应将资源放入resources
文件夹(被intellij本身标记为资源根目录),这些资源将转到您已编译的应用程序的根目录。
我的意思是,/resources/myfont.ttf
将进入生成的版本中的/myfont.ttf
。
因此,您应该通过/myfont.ttf
而不是myfont.ttf
来获取它。像这样使用它:
getClass().getResource("/myfont.ttf");
无需更改其他任何内容。只是这个帮助了我。
答案 4 :(得分:1)
如果您的项目是Gradle,请选中Settings
-> Build, Execution, Deployment
-> Gradle
-> Build and run
部分。
确保"Build and run using"
选项为"Gradle"
。
Intellij IDEA的编译器不会复制“资源”来构建dir也不测试类路径。 而且,它意外地使用了虚拟的“ out”目录而不是“ build”。
已更新:仅一个选项“ Build and run using”就足以设置为Gradle。
答案 5 :(得分:0)
根据建议,更新答案。
第1步
第2步
第3步
第4步
重新运行Java程序,现在它应该可以工作了。
<-上一个答案---->
Fixed similar issue today by adding resources folder into Resource Tab in IntelliJ IDE
希望这会有所帮助。另外,details tutorial。
答案 6 :(得分:0)
首先,您需要为IntelliJ设置 src 和 resource 文件夹。
请参阅java(蓝色)和resources(黄色4行)文件夹附近的图标。
之后,在java文件夹和资源文件夹中创建相同的包。
├─ src
├─ main
├─ java
| └─ com
| └─ example
| └─ A.class
|
└─ resources
└─ com
└─ example
└─ fxml
└─ AFXML.fxml
在A.class中,您可以使用它。
Java
FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml/AFXML.fxml"));
Parent root = loader.load();
科特琳
val loader = FXMLLoader(javaClass.getResource("fxml/AFXML.fxml"))
val root = loader.load<Parent>()
或
val loader = FXMLLoader(A::class.java.getResource("fxml/AFXML.fxml"))
val root = loader.load<Parent>()
答案 7 :(得分:0)
在 Project Structure
> Project
中,您必须确保 Project compiler output:
已填充其值。在我的情况下,它没有。将其指向项目中的 ./target
或 ./bin
(无论您拥有什么)目录。
答案 8 :(得分:0)
非常令人沮丧。还会发生的情况是包含资源的目录有时被创建为:
└── resources
└── my.tests
├── t1.txt
└── t2.txt
代替:
└── resources
└── my
└── tests
├── t1.txt
└── t2.txt
解决方案是手动重新创建目录结构,使其类似于第二个示例。
如果您使用 maven 来消除这是 IDE 问题的可能性,我还建议您在命令行上(使用 mvn clean test)对您的测试进行故障排除。
答案 9 :(得分:-1)
我放弃了尝试使用
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());
答案 10 :(得分:-1)
Windows区分大小写,世界其他地方没有。另外一个可执行的Java jar(zip格式)资源名称区分大小写。
最佳重命名文件
view/RootLayout.FXML
到
view/RootLayout.fxml
这必须通过移开原始文件并创建一个新文件来完成。
还要编译到jar,并检查fxml文件是否已添加到jar(zip文件)中。当没有IntelliJ资源路径被其他答案处理时。
顺便说一下,这是相对于getClass()
的包路径的路径。请注意,如果您将此类扩展为完整路径更改,请更好地使用:
MainApp.class.getResource("view/RootLayout.fxml")