我有一个使用简单预加载器的程序,而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));
}
答案 0 :(得分:1)
来自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();
}
}
}
如果继续阅读,甚至可以分享两个阶段(预加载器和主应用阶段)......
答案 1 :(得分:0)
我尝试了之前显示的解决方案,但是没有用,然后我写了一个对我有用的代码,我所做的是使preloader不被自身隐藏,它只是在显示主应用程序时被隐藏,看起来: / p>
在预加载时:
我评论了stage.hide();
@Override
public void handleStateChangeNotification(StateChangeNotification scn) {
if (scn.getType() == StateChangeNotification.Type.BEFORE_INIT) {
//stage.hide();
}
}
我将舞台设置为静态
static Stage stage;
我添加了以下代码:
public static Stage getStage() {
return stage;
}
在主应用上:
@Override
public void start(Stage stage) throws IOException {
scene = new Scene(loadFXML("fxmlLoginGUI.fxml"), 640, 480);
stage.setScene(scene);
stage.show();
if (stage.showingProperty().get()) {
try {
UkhuluvelaERP_Preloader.getStage().hide();
} catch (Exception ex) {
Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
我检查阶段是否已经显示,然后使用get方法将预加载器阶段设置为hide()。
我希望这对你们一样对我有用。祝好运。雪儿