首先,我绝对不是母语人士,所以我希望我能正确描述这篇文章中的内容:D
那么问题是什么?当我尝试用几个不同的“窗口”构建一个 javaFX 应用程序时。问题是当我尝试在我的 MainController 类中构建一个 initialize() 函数时。此功能应加载第一个带有登录名和密码字段的窗口。
只有当我在 MainController 类的 initialize() 方法中添加一些逻辑以加载另一个窗口时,才会出现问题。对我来说这很奇怪,因为根据控制台的主要问题是编译器找不到构建主窗口的 .fxml 文件,而不是第二个(由 initialize() 方法构建)。
如果有人知道似乎是什么问题?
错误是:
未找到:.file:/C:/Users/ADMIN/workspace%20FX/SchoolList/target/classes/fxml/AppMainScreen.fxml //
那是我的 try/catch 块的输出,.fxml 文件肯定在那里。路径和名称是正确的。
javafx.fxml.LoadException:/C:/Users/ADMIN/workspace%20FX/SchoolList/target/classes/fxml/AppMainScreen.fxml
在 javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579) 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441) 在 javafx.fxml。 FXMLLoader.load(FXMLLoader.java:2409) 在 pl.mati.schoolList.app.SchoolListApp.start(SchoolListApp.java:28) 在 com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863 ) at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326) at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295) at java.security。 AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 在 com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 在 com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 在 java.lang.Thread .run(Thread.java:745)
引起: pl.mati.schoolList.controllers.MainController.initialize(MainController.java:73) 处 的java.lang.NullPointerException 在 javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548) ... 应用程序启动方法 java.lang.reflect.InvocationTargetException 中的其他 12 个异常在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl .invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 com.sun.javafx.application。 LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389) 在 com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke( NativeMethodAccessorImpl.java:62) 在 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) 原因:java.lang.RuntimeException :在 com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182) 在 java 的 com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917) 的应用程序启动方法中的异常。 lang.Thread.run(Thread.java:745)application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182) 在 java.lang.Thread.run(Thread.java:745)application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182) 在 java.lang.Thread.run(Thread.java:745)
原因: java.lang.NullPointerException: 在 pl.mati.schoolList.app 的 javafx.scene.Scene.(Scene.java:194) 的 javafx.scene.Scene.(Scene.java:336) 的 根不能为空。 SchoolListApp.start(SchoolListApp.java:42) 在 com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863) 在 com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326) 在 com.sun.javafx .application.PlatformImpl.lambda$null$173(PlatformImpl.java:295) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)在 com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 在 com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 在 com.sun.glass.ui.win。 WinApplication.lambda$null$148(WinApplication.java:191) ... 1 另外运行应用程序 pl.mati.schoolList.app.SchoolListApp 的异常
编译器无法加载 fxml 文件,这会导致在应该注入 StackPane 的地方出现 nullPointerException(从 fxml 文件加载 stackPane)。
这是我的课程:我的主课程,启动应用程序的地方。
SchoolListApp.class
public class SchoolListApp extends Application{
public static void main (String[] args){
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader();
StackPane mainStackPane = null;
URL path = getClass().getResource("/fxml/AppMainScreen.fxml");
try {
loader.setLocation(path);
mainStackPane = (StackPane) loader.load();
}
catch (IOException e) {
System.out.println("Not found: " + path);
e.printStackTrace();
}
catch (Exception e) {
// Answer:
e.getCause().printStackTrace();
}
MainController controller = loader.getController();
Scene scene = new Scene(mainStackPane); //here i got the Caused by: java.lang.NullPointerException: Root cannot be null. error//
stage.setScene(scene);
stage.setTitle("School List Manager Application");
stage.show();
}
}
主控制器类。如果 initiliazie 方法为空 - 编译器可以正常工作并构建第一个窗口。但是当我尝试构建另一个窗口时,我得到了错误。
MainController.class
public class MainController implements Initializable{
@FXML
private StackPane mainStackPane;
@FXML
public void initialize(){
FXMLLoader loader = new FXMLLoader();
Pane pane = null;
URL path;
path = getClass().getResource("/fxml/HelloWindow.fxml");
try {
loader.setLocation(path);
pane = loader.load();
}
catch (IOException e) {
System.out.println("Not found: " + path);
e.printStackTrace();
}
catch (Exception e) {
// Answer:
e.getCause().printStackTrace();
}
mainStackPane.getChildren().add(pane);
}
public MainController() {
}