[英]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">
我认为可以要求提供以下信息:
用GluonHQ SceneBuilder制作的GUI。
有两种方法可以做到这一点。 我更喜欢方法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.fxml
在fxml/
文件夹中,因此从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.