在继续JavaFX之前更新UI并强行等待

Hen*_*Lin 5 java multithreading javafx

我在这里展示了我欢迎场景的图像.

图片

" 创建新项目"按钮的当前行为如下所示:

Stage stage = (Stage)((Node)event.getSource()).getScene().getWindow();
stage.hide();
Parent root = FXMLLoader.load(getClass().getResource("/view/scene/configure/NewProjectConfigureScene.fxml"));
Scene scene = new Scene(root);
stage.setTitle("Configure New Project Settings");
stage.setScene(scene);
stage.show();
Run Code Online (Sandbox Code Playgroud)

用文字解释:按下按钮 - >我得到舞台 - >隐藏当前场景 - >切换舞台以获得新场景 - >重新显示舞台.这种行为很有效.

我是GUI编程的新手,所以当我解释我需要的东西时,请耐心等待.

我现在想添加一个小功能,其中在新建项目时按下按钮,将显示在当前场景加载消息,我迫使GUI等待几秒钟(使用户有时间来看看这个"装"消息",然后继续进入下一个场景.加载消息看起来像这样.

图片

我真的想要实现这个功能,因为加载消息后面的等待可能更直观,从而改善了我在使用程序时的用户体验.

我最初的尝试是做以下事情:

statusText.setText("Please wait..."); // statusText is the "loading message"
Stage stage = (Stage)((Node)event.getSource()).getScene().getWindow();
try {
    Thread.sleep(2000);                
} catch(InterruptedException ex) {
    Thread.currentThread().interrupt();
}
stage.hide();

Parent root = FXMLLoader.load(getClass().getResource("/view/scene/configure/NewProjectConfigureScene.fxml"));
Scene scene = new Scene(root);
stage.setTitle("Configure New Project Settings");
stage.setScene(scene);
stage.show();
Run Code Online (Sandbox Code Playgroud)

我刚读到这里你永远不会睡觉UI线程,因为它会冻结整个应用程序.所以我一直在尝试从上面链接的第一个答案中提到的方法,它说要使用javafx.concurrent.Task,但是我已经尝试了很长时间无济于事.

如何更新UI,强行等待几秒钟,然后显示新场景?

jew*_*sea 11

暂停完成后,使用PauseTransition并加载新场景,而不是休眠线程.

createNewProject.setOnAction(event -> {
    statusText.setText("Please wait...");
    PauseTransition pause = new PauseTransition(
        Duration.seconds(1),
    );
    pause.setOnFinished(event -> {
        Parent root = FXMLLoader.load(
            getClass().getResource(
                "/view/scene/configure/NewProjectConfigureScene.fxml"
            )
        );
        Scene scene = new Scene(root);
        stage.setTitle("Configure New Project Settings");
        stage.setScene(scene);
        stage.sizeToScene();    
    });
    pause.play();
});
Run Code Online (Sandbox Code Playgroud)

上面的代码假设您只有一个阶段,因此您可以调整"欢迎"阶段的大小,使其成为"配置新项目设置"阶段.

  • 非常感谢.... 我想这就是我要找的。(现在正在尝试),只是我使用了场景构建器,而且我对 lambda 表达式语法不是很熟悉 ->。我现在就去读一读。 (2认同)