代码之家  ›  专栏  ›  技术社区  ›  Victor Laerte

JavaFX应用程序在调用其他场景时返回NullPointerException(只是有时)

  •  0
  • Victor Laerte  · 技术社区  · 13 年前

    我的应用程序有一个登录场景和一个主视图场景,当我登录时发生的事情是,主视图被称为有时我会得到这个例外:

    java.lang.NullPointerException
        at javafx.scene.Scene.focusInitial(Scene.java:1879)
        at javafx.scene.Scene.access$3600(Scene.java:170)
        at javafx.scene.Scene$ScenePulseListener.focusCleanup(Scene.java:2181)
        at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2221)
        at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:363)
        at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:460)
        at com.sun.javafx.tk.quantum.QuantumToolkit$9.run(QuantumToolkit.java:329)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
        at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
        at java.lang.Thread.run(Thread.java:722)
    

    令人好奇的是,这种情况并不总是发生, 只是有时候。

    我的班级:

    public class TargetAppDesktop extends Application {
    
        @Override
        public void start(Stage primaryStage) throws IOException {
    
            Scene scene = new Scene(new AnchorPane());
    
            LoginManager loginManager = new LoginManager(scene);
            loginManager.showLoginScreen();
            primaryStage.setResizable(false);
            primaryStage.setScene(scene);
            primaryStage.show();
    
            primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
                @Override
                public void handle(WindowEvent t) {
                    MainViewController.deleteTempFiles();
                    Platform.exit();
                    System.exit(0);
                }
            });
    
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    我的登录管理器类

    public class LoginManager {
    
        private Scene scene;
    
        LoginManager(Scene scene) {
            this.scene = scene;
        }
    
        public void logout() {
            showLoginScreen();
        }
    
        void showLoginScreen() {
            try {
                FXMLLoader loader = new FXMLLoader(
                        getClass().getResource("Login.fxml"));
                //         scene.getStylesheets().add(this.getClass().getResource("Login.css").toExternalForm());
    
                scene.setRoot((Parent) loader.load());
                LoginController controller =
                        loader.<LoginController>getController();
                controller.initManager(this);
            } catch (IOException ex) {
                Logger.getLogger(LoginManager.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    
        void showMainViewScreen(Login loginTargetApp, Login loginGateway, Gateway gateway, File file, ArrayList<Integer> anoList) {
    
                try {
    
                    FXMLLoader loader = new FXMLLoader(getClass().getResource("MainView.fxml"));
    
                    scene.setRoot((Parent) loader.load());
    
                    MainViewController controller = loader.<MainViewController>getController();
    
                    controller.initSessionID(this, scene, loginTargetApp, loginGateway, gateway, file, anoList);
    
                } catch (Exception ex) {
                    Logger.getLogger(LoginManager.class.getName()).log(Level.SEVERE, null, ex);
                }
    
        }
    
        void autheticated(Login loginTargetApp, Login loginGateway, Gateway gateway, File file, ArrayList<Integer> anoList) {
            showMainViewScreen(loginTargetApp, loginGateway, gateway, file, anoList);
        }
    }
    
    1 回复  |  直到 13 年前
        1
  •  0
  •   Victor Laerte    13 年前

    出现这个问题是因为我试图在另一个线程中更改场景,但必须在Javafx主线程中更改,所以一个简单的Platform.run后来解决了我的问题。

    您可以找到更多详细信息 here. (JIRA link)