显示预加载器和舞台之间的延迟

时间:2016-04-15 08:47:54

标签: java javafx delay preloader

我有一个使用简单预加载器的程序,而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));
}

2 个答案:

答案 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()。

我希望这对你们一样对我有用。祝好运。雪儿