1

首先,我绝对不是母语人士,所以我希望我能正确描述这篇文章中的内容: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() {

    }
4

0 回答 0