IntelliJ IDEA - getClass()。getResource(" ...")返回null

时间:2014-10-12 17:38:20

标签: java intellij-idea javafx fxml

我正在使用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

结果是一样的。请知道

11 个答案:

答案 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)

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");

无需更改其他任何内容。只是这个帮助了我。

答案 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步

  1. 右键单击项目
  2. 单击将目录标记为
  3. 单击源根目录

第2步

  1. 单击菜单栏中的文件
  2. 单击“项目结构”以打开设置面板

第3步

  1. 点击“模块”标签
  2. 如您所见,没有任何资源文件夹添加为内容根
  3. 我们需要在其中添加资源文件夹

第4步

  1. 确保单击资源文件夹
  2. 之后单击“资源”选项卡
  3. 您将在右侧面板中看到资源文件夹已添加为“资源文件夹”

重新运行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行)文件夹附近的图标。

enter image description here

右键单击java文件夹,然后选择 sources root enter image description here

并右键单击Java文件夹,然后选择资源根 enter image description here

之后,在java文件夹和资源文件夹中创建相同的包。

例如:packages-> org.example enter image description here

├─ 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")