繁体   English   中英

应用程序启动方法异常-JavaFX

[英]Application Start Method exception - JavaFX

我想说的是,我在SO中看了很多东西,但没有帖子对我有帮助,所以我再次询问...

我试图制作一个登录屏幕,但仍然出现相同的异常。 我的目录结构如下: 在这里检查

我的代码如下所示:

    public class main extends Application {

        @Override
        public void start(Stage stage) throws Exception {
            Parent root = FXMLLoader.load(getClass().getResource("fxml/loginScene.fxml"));
          //Parent root = FXMLLoader.load(getClass().getResource("../login/login.fxml"));
          //Parent root = FXMLLoader.load(getClass().getResource("login.fxml"));
          //Parent root = FXMLLoader.load(getClass().getResource("src/relativepath//login/login.fxml"));
          //Parent root = FXMLLoader.load(getClass().getResource("/home/somepath/src/relativepath/login/login.fxml"));
          //Parent root = FXMLLoader.load(getClass().getResource("fxml/loginScene.fxml"));

            stage.setScene(new Scene(root));
            stage.show();
        }

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

这是我得到的例外:

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$154(LauncherImpl.java:182)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException: Location is required.
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3207)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
    at br.com.fulltime.fullcam.mosaicoDesktop.main.Main.start(Main.java:12)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at com.sun.glass.ui.gtk.GtkApplication.lambda$null$48(GtkApplication.java:139)
    ... 1 more

到目前为止,我读过的所有内容都说:“这就是FXML找不到控制器的原因!”,所以我检查了一下,这真的没问题。 这是控制语句:

fx:controller="br.com.mycompany.myproduct.module.login.controllerLogin">

我认为可以要求提供以下信息:

有两种方法可以做到这一点。 我更喜欢方法1,因为它对我来说似乎更简单。

要加载资源,您需要知道路径。 控制器知道它们自己的路径,因此我使用它们。

例如,如果我有一个包含MainController.java文件的java/hypnic/jerk/controllers/层次结构,并且我想加载一个将XML文件用作其控制器的FXML文件,则将其放在resources/hypnic/jerk/controllers/ 然后,当我调用FXMLLoader.load(); 我这样做:

FXMLLoader.load(MainController.class.getResource("mainScreen.fxml"));

根据我的理解和看法,这告诉加载程序使用MainController设置的路径,并从那里的路径中获取mainScreen.fxml文件。

在我看来,这是最简单的方法,因为它会强制您保持命名约定,并且您知道每个FXML文件在哪个位置用于关联的控制器文件。

您还可以使用路径找到它,在您的情况下,您的loginScene.fxmlfxml/文件夹中,因此从Main我会做

FXMLLoader.load(getClass().getResource("../../../../fxml/loginScene.fxml"));

../表示上一个目录/文件夹。 因此,请根据您可能对物品进行遮光的方式来记住它们. 是该名称下的新文件夹,您需要添加../直到返回到java文件夹。

让我们将示例与java/br/com/one/two/three/main/路径一起使用。 由于您的代码说的是getClass().getResource("fxml/loginScene.fxml")您要在resources/br/com/one/two/three/fxml/文件夹中resources/br/com/one/two/three/fxml/文件。 该路径基于调用类Main.java ,因此找不到该路径,因为resources中的路径不存在。

因此,您需要使用../来退出这些目录,直到找到为止。 每个../代表另一层。 因此,在这种情况下,如果我正确地进行了数学计算,则需要5 ../才能找到fxml/loginScene.fxml文件。 所以最终结果是

FXMLLoader.load(getClass().getResource("../../../../../fxml/loginScene.fxml"));

现在请记住,这只是一个解释,您将不得不自行调整它。

希望这会有所帮助。

实际上,您正在获得NPE。 尝试调试,然后,您可以尝试以下操作:

public void start(Stage stage) throws Exception {
    FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/fxml/loginScene.fxml"));
    Parent root = loader.load();
    stage.setScene(new Scene(root));
    stage.show();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM