Preloader和Stage之间的延迟显示
问题描述:
我有一个程序使用简单的预加载程序,而init()
方法创建主要的gui。一切正常,但在init()
方法完成并且预加载器消失之后,在主要阶段出现之前会有明显的延迟。我说很明显,因为它可能高达7秒,足以让用户感到困惑。Preloader和Stage之间的延迟显示
我试图尽可能少的投入尽可能在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的咨询和实施的预加载的淡出。还是有一点延迟,所以我发送了最后通知(从主程序到预加载程序)后显示主舞台,它的工作完美!
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();
}
}
}
如果你继续阅读,甚至有共享的两个阶段(预加载和主要应用阶段)的方式...