JavaFX NullPointerException位置是必需的NetBeans

时间:2015-07-07 21:17:31

标签: java netbeans javafx

我已经尝试了我在堆栈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);
    }

}

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:8)

问题出在这一行:

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

很明显,load方法实际上是使用null参数调用的。这是因为getResource(“/ sample / sample.fxml”)无法归档该资源。

运行时类路径上缺少(或路径错误)资源。

Source

答案 1 :(得分:0)

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

Build > Deployment下的项目属性中的netbeans 8.2中,有一个复选框:

  

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

有了它,它有效。祝你好运。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:-2)

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