JavaFX NullPointerException位置需要NetBeans



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

当我用示例代码创建新的JavaFX应用程序时,该示例代码给出了单击后打印hello world的按钮,当我将其作为桌面应用程序运行时,以及当我构建此应用程序并在浏览器中启动时,此应用程序有效。作为桌面应用程序和浏览器应用程序

但是当我创建新的JavaFX FXML应用程序时,它几乎与上面相同,但阶段是由FXML和css定义的,而不是字节代码。

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

有人能帮帮我吗?

问题在这一行:

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

很明显,load方法实际上是带空参数调用的。这是因为getResource("/sample/sample.fxml")不能将资源归档。

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

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

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

请求无限制访问(启用签名)

有了这个,它就工作了。好运。

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

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

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

如果你使用不同的包,那么从其他包中剪切该文件并粘贴到主包中。然后试着逃跑。我试过这种方法,现在效果很好。

相关内容

  • 没有找到相关文章

最新更新