当前位置: 首页 > 知识库问答 >
问题:

JavaFX和maven:NullPointerException:Location是必需的

咸琪
2023-03-14

我一直在尝试用JavaFX来设置Maven。尽管我对Maven和JavaFX没有经验,但我没想到这会是一个如此大的挑战。我的Java知识相当扎实(包括Swing),没想到设置起来会有这么大的困难。

package sample;

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

public class Main extends Application
{
    @Override
    public void start(Stage primaryStage) throws Exception
    {
        //getClass().getResource("../../resources/sample.fxml");
        Parent root = FXMLLoader.load(getClass().getResource("../sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }


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

我的pom.xml也不太大:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>sample</groupId>
    <artifactId>JavaFXDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <organization>
        <name>RubberDucky</name>
    </organization>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>com.zenjava</groupId>
                    <artifactId>javafx-maven-plugin</artifactId>
                    <version>2.0</version>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <groupId>com.zenjava</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>2.0</version>
                <configuration>
                    <mainClass>sample.Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>javafx</artifactId>
            <version>2.2</version>
            <systemPath>${java.home}/lib/jfxrt.jar</systemPath>
            <scope>system</scope>
        </dependency>
    </dependencies>
</project>

我正在使用JavaFX Maven插件构建应用程序。运行mvn clean jfx:jar之后,一切看起来都很好,所有构建都成功了。但当我尝试运行应用程序时,却出现以下错误:

Exception in Application start method
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at com.javafx.main.Main.launchApp(Main.java:698)
        at com.javafx.main.Main.main(Main.java:871)
Caused by: java.lang.RuntimeException: Exception in Application start method
        at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown So
urce)
        at com.sun.javafx.application.LauncherImpl.access$000(Unknown Source)
        at com.sun.javafx.application.LauncherImpl$1.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Location is required.
        at javafx.fxml.FXMLLoader.load(Unknown Source)
        at javafx.fxml.FXMLLoader.load(Unknown Source)
        at javafx.fxml.FXMLLoader.load(Unknown Source)
        at javafx.fxml.FXMLLoader.load(Unknown Source)
        at javafx.fxml.FXMLLoader.load(Unknown Source)
        at sample.Main.start(Main.java:15)
        at com.sun.javafx.application.LauncherImpl$5.run(Unknown Source)
        at com.sun.javafx.application.PlatformImpl$5.run(Unknown Source)
        at com.sun.javafx.application.PlatformImpl$4$1.run(Unknown Source)
        at com.sun.javafx.application.PlatformImpl$4$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl$4.run(Unknown Source)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.access$100(Unknown Source)
        at com.sun.glass.ui.win.WinApplication$3$1.run(Unknown Source)
        ... 1 more

经过一些粗略的调试,问题似乎出现在我正在加载文件的路径上。将sample.fxml硬编码到硬盘驱动器上后,应用程序运行时没有任何问题。从IntelliJ运行应用程序时,当前的设置(见上图)也是如此。

共有1个答案

司寇祖鹤
2023-03-14

确保sample.fxmlsrc/main/resources/目录(或子目录)中。然后您可以访问该文件,如下所示:

Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("sample.fxml"));

说明:在编译阶段,所有资源和类都被复制到target/classes/。因此您的fxml文件驻留在这个目录中,而您的类则驻留在关于其包名的子目录中。如果调用getClass().getResource(“sample.fxml”);,则将相对于类文件搜索该文件,该类文件将是以下目录:target/classes/sample/

在类加载器上调用.getResource()将相对搜索路径设置为target/classes/,因此可以找到您的文件。

附注。你也可以写:

Parent root = FXMLLoader.load(getClass().getResource("/sample.fxml"));
 类似资料:
  • 所以我尝试构建一个JavaFX应用程序,但得到一个NullPointerException“location is required”。我已经找到了一些关于这个的问题,但没有一个答案对我有效。 我已经试过了: 并将fxmldocument.fxml移动到默认包,但这些操作对我都不起作用。这是Netbeans创建的未经改动的JavaFX FXML应用程序,我真的不明白为什么这不能开箱即用... 项目

  • 但是当我创建新的JavaFX FXML应用程序时,这个应用程序和上面的几乎一样,但是阶段是由FXML和css定义的,而不是字节代码。这一个可以作为windows应用程序完美地工作,但不能作为浏览器应用程序工作 下面是工作应用程序的代码: 并且此应用程序在浏览器中无法工作并引发异常: 有人能帮帮我吗?

  • 我得到了 fxml_example.fxml FXMLExAmple.java

  • 问题内容: 我需要知道AngularJS是否用作前端的js框架,模板引擎是否需要单独的Handlebars?…就像我认为的那样,模板引擎功能可以使用AngularJS本身完成! 问题答案: 没错,把手和Angular在一起将毫无用处。 把手和Angular是完全不同的东西。 车把是一个模板引擎。您编写一个奇特的templatey- string,为其提供一个JSON对象,并从数据中渲染HTML。没

  • 我试图让我的JavaFX程序运行,但有一些困难。我一直得到一个错误的java.lang.NullPointerExc农田:位置是必需的。fxml文件与Application类在同一个包中。这是我非常简单的代码: 这是我main.fxml文件的副本: 控制器类确实存在,并且位于fxml文件中指定的包中。我所有的名字都是正确的,我认为它们应该在哪里。我错过了什么?我确实尝试过重命名我的fxml文件,以

  • 问题内容: 我正在尝试运行JavaFX程序,但遇到了一些困难。我不断收到错误消息“ :必须提供位置”。fxml文件与Application类位于同一软件包中。这是我非常简单的代码: 这是我的main.fxml文件的副本: 控制器类确实存在,并且位于fxml文件中指定的包中。我所有的名字都是正确的,也是我认为应该的位置。我想念什么?我确实尝试重命名我的fxml文件,以防这是一个名称问题。请帮忙。仅供