【问题标题】:JavaFX NullPointerException Location is required NetBeans [duplicate]JavaFX NullPointerException 位置是必需的 NetBeans [重复]
【发布时间】:2015-09-25 13:59:22
【问题描述】:

我已经尝试了我在堆栈 stackoverflow 上找到的其他任何东西,但我真的不明白为什么这不起作用。 我不会向您展示我的应用程序不工作的代码,因为即使使用示例项目它也不能工作。 那么问题来了:

当我使用示例代码创建新的 JavaFX 应用程序时,该应用程序会提供单击后打印 hello world 的按钮,当我将它作为桌面应用程序运行以及构建它并在浏览器中启动时,它可以工作。这可以完美地用作桌面和浏览器应用程序

但是当我创建新的 JavaFX FXML 应用程序时,它与上面几乎相同,但阶段由 fxml 和 css 定义,而不是字节代码。这个可以完美地作为 Windows 应用程序运行,但不能作为浏览器应用程序运行

java.lang.NullPointerException: Location is required.
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.load(Unknown Source)
    at javafxapplication3.JavaFXApplication3.start(JavaFXApplication3.java:22)
    at com.sun.javafx.applet.FXApplet2$2.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$170(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$46/15592694.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$45/19532686.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.lambda$null$145(Unknown Source)
    at com.sun.glass.ui.win.WinApplication$$Lambda$35/9825943.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.NullPointerException: Location is required.
    at com.sun.javafx.applet.FXApplet2$2.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$170(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$46/15592694.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$45/19532686.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.lambda$null$145(Unknown Source)
    at com.sun.glass.ui.win.WinApplication$$Lambda$35/9825943.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Location is required.
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.load(Unknown Source)
    at javafxapplication3.JavaFXApplication3.start(JavaFXApplication3.java:22)
    ... 11 more

这是工作应用程序的代码:

public class JavaFXApplication4 extends Application {

    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

这个应用程序在浏览器中无法运行并抛出异常:

public class JavaFXApplication3 extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

        Scene scene = new Scene(root);

        stage.setScene(scene);
        stage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

有人可以帮我吗?

【问题讨论】:

    标签: java netbeans javafx


    【解决方案1】:

    问题出在这一行:

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

    很明显,加载方法实际上是用一个空参数调用的。发生这种情况是因为 getResource("/sample/sample.fxml") 无法归档该资源。

    运行时类路径中的资源丢失(或路径错误)。

    Source

    【讨论】:

      【解决方案2】:

      问题与签名有关,但我不完全理解这意味着什么。然后我搜索了如何在带有 netbeans 的浏览器中运行 JavaFX 应用程序,发现:http://docs.oracle.com/javafx/2/fxml_get_started/fxml_deployment.htm

      Build &gt; Deployment下的项目属性中的netbeans 8.2中有一个复选框:

      请求不受限制的访问(启用签名)

      有了这个就可以了。祝你好运。

      【讨论】:

        【解决方案3】:

        在某些情况下,如果您使用 maven,您应该将所有 fxml 文件移动到资源目录并使用那里的相对地址。

        如果你想在控制器类中使用stage.setScene()函数,最好使用:

        Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("FXMLDocument.fxml"));
        Scene scene = new Scene(root);
        

        【讨论】:

          【解决方案4】:

          如果您使用不同的包,则从其他包中剪切该文件并将其粘贴到主包中。然后尝试运行。我已经尝试过这种方法,现在效果很好。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-04-18
            • 2020-12-18
            • 2022-01-05
            • 1970-01-01
            • 1970-01-01
            • 2013-06-13
            • 2015-05-12
            • 2018-11-08
            相关资源
            最近更新 更多