我有一个在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();
}
}
}
如果您继续阅读,甚至可以共享两个阶段(预加载器和主应用程序阶段)...