IntelliJ Idea + JavaFX = class.getResource()返回null

时间:2017-12-22 10:27:42

标签: java intellij-idea javafx null resources

我知道,这里有很多类似的问题,类似的问题,但在阅读了大量的帖子后,我不能简单地解决这个问题。 在编译器>下资源模式,我已经把这个字符串" * .fxml"。此外,我已将资源文件夹标记为资源根目录。

在这里你可以看到我的项目结构:

Project Structure

这是我的 MainView.java 类。

package dataParser.View;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;


public class MainView extends Application {
    private Stage primaryStage;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        this.primaryStage = primaryStage;

        FXMLLoader loader = new FXMLLoader();
        System.out.println(this.getClass().getResource("/MainView.fxml"));
        loader.setLocation(getClass().getResource("/MainView.fxml"));

        MainViewController mainViewController = new MainViewController();
        mainViewController.setMainApp(this);

        loader.setController(mainViewController);
        Parent layout = loader.load();

        Scene scene = new Scene(layout);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    Stage getPrimaryStage() {
        return primaryStage;
    }

}

尽管如此,我还是回来了一个空资源。任何提示?
谢谢!

修改
这是完整的堆栈跟踪。我还注意到我发布了链接所有资源文件的问题。

    Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:973)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:198)
    at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: java.lang.IllegalStateException: Location is not set.
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2459)
    at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)
    at dataParser.View.MainView.start(MainView.java:29)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:919)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$11(PlatformImpl.java:449)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(PlatformImpl.java:418)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:417)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:175)
    ... 1 more

2 个答案:

答案 0 :(得分:1)

过了一段时间,我找到了解决这个讨厌问题的方法,我会尽力在这里解释一下。

首先,我以正确的方式设置了我的项目结构(文件>项目结构......),定义了Source和Resource文件夹,以便IntelliJ Idea能够找到它们。此外,我已经检查过我的资源文件已正确放入" build"和" out"文件夹(Gradle和IntelliJ在构建过程中使用它们):我也通过设置我的"文件|设置|编译器"来实现它。在许多Stack Overflow答案中很好地确定了设置 最后我在调用我的资源文件时使用了这个结构:

FXMLLoader loader = new FXMLLoader();
System.out.println(MainView.class.getResource("/fxml/MainView.fxml"));
loader.setLocation(MainView.class.getResource("/fxml/MainView.fxml"));

我想确定我的" fxml"文件夹的上层文件夹是"资源"之一。

答案 1 :(得分:0)

问题可能是IntelliJ不知道它需要将.fxml文件复制到输出目录中。您可能需要在“文件”|“设置”|“编译器”设置中添加“; .fxml;? .css”之类的内容,以告知它在构建期间复制文件。有关详细信息,请参阅How to convert a normal java project in intellij into a JavaFx project