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

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

图片

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

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(); 

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

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

我现在正在尝试添加一个小function,当按下Create New Project按钮时,当前场景中出现加载消息,我强制GUI等待几秒钟(这样用户有时间看到这个“loading “消息”,然后继续进入下一个场景。 加载消息看起来像这样。

图片

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

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

 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(); 

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

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

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

 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(); }); 

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

您应该尝试添加ControlsFX,这将有所帮助。

您可以执行以下操作:

  Service service = new Service(){ @Override protected Task createTask() { return new Task() { @Override protected T call() throws Exception { //Do your processing here. } }; } }; service.setOnSucceeded(event -> {//do your processing}); service.setOnFailed(event -> {//do your processing}); ProgressDialog pd = new ProgressDialog(service); pd.setContentText("Please wait while the window loads..."); pd.initModality(Modality.WINDOW_MODAL); pd.initOwner(stage); service.start(); 

这将把你的代码放在后台线程上。 ControlsFX对话框随服务启动和停止。