我有一个在init()方法创建主gui时使用简单预加载器的程序。一切正常,但是init()方法完成并且预加载器消失之后,在显示主阶段之前会有明显的延迟。我说这很引人注目,因为它可能长达7秒,足以使用户感到困惑。

我尝试将start()方法中的内容尽量减少:

public void start(Stage stage) {
    /*Scene*/
    scene = new Scene(root, 1200, 700);
    stage.setScene(scene);
    scene.setFill(null);

    /*Stage*/
    stage.initStyle(StageStyle.TRANSPARENT);
    stage.centerOnScreen();
    stage.show();

}


有没有办法减少/消除这种延迟?完全废弃预加载器并将其作为主程序的一个阶段会更好吗?提前致谢。

编辑:

我接受了Maverick283的建议,并实现了预加载器的fadeOut。仍然有些延迟,因此我在显示了主舞台后发送了最终通知(从主程序到预加载器),并且效果很好!

public void start(Stage stage) {
    /*Scene*/
    scene = new Scene(root, 1200, 700);
    stage.setScene(scene);
    scene.setFill(null);

    /*Stage*/
    stage.initStyle(StageStyle.TRANSPARENT);
    stage.centerOnScreen();
    stage.show();
    notifyPreloader(new Preloader.ProgressNotification(0.99));
}

最佳答案

Oracle


预加载器在应用程序启动之前收到的最后一个状态更改通知是StateChangeNotification.Type.BEFORE_START。处理完成后,将调用应用程序的start()方法。但是,在调用start()方法之后,应用程序准备显示其阶段可能要花费一些时间。如果预加载器阶段已隐藏,则可能会在一段时间内应用程序在屏幕上什么都没有显示。


因此,他们提供了示例代码来解决此问题:

@Override
public void handleStateChangeNotification(StateChangeNotification evt) {
    if (evt.getType() == StateChangeNotification.Type.BEFORE_START) {
        if (isEmbedded && stage.isShowing()) {
            //fade out, hide stage at the end of animation
            FadeTransition ft = new FadeTransition(
                Duration.millis(1000), stage.getScene().getRoot());
                ft.setFromValue(1.0);
                ft.setToValue(0.0);
                final Stage s = stage;
                EventHandler<ActionEvent> eh = new EventHandler<ActionEvent>() {
                    public void handle(ActionEvent t) {
                        s.hide();
                    }
                };
                ft.setOnFinished(eh);
                ft.play();
        } else {
            stage.hide();
        }
    }
}


如果您继续阅读,甚至可以共享两个阶段(预加载器和主应用程序阶段)...

09-27 12:07