2016-02-12 257 views
4

我在这里展示我的欢迎场景的图像。在继续之前更新您的UI并强制等待JavaFX

image

新建项目按钮在此处显示的当前行为:

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编程的新手,所以请耐心等我解释一下我需要什么。

我现在试图添加一个小功能,当按下创建新项目按钮时,当前场景中会显示一条加载消息,我强制GUI等待几秒钟(以便用户有时间去看这个“加载”消息),然后继续下一个场景。加载消息看起来像这样。

image

我真的要实现此功能,因为加载信息,然后等待可以更直观,使用该程序时,从而提高自己的用户体验。

我最初的尝试是做到以下几点:

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

我刚才读here,你永远无法入睡的UI线程,因为它会冻结整个应用程序。所以我一直在尝试上述链接的第一个答案中提到的方法,其中说使用javafx.concurrent.Task,但我一直试图很长时间无济于事。

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

回答

8

而不是睡觉的线程,使用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(); 
}); 

上面的代码假设你只有一个单一的舞台,让你调整你的“欢迎光临”的阶段,成为“配置新项目设置”的阶段。

+1

非常感谢你......我想这就是我一直在寻找的东西。 (现在试试),这只是我使用场景构建器,我不熟悉lambda expresion语法 - >。我现在去读一读。 –

+0

这太棒了,谢谢@jewelsea –

0

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

你可以做到以下几点:

Service<T> service = new Service<T>(){ 
     @Override 
     protected Task<T> createTask() { 
     return new Task<T>() { 
      @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对话框随服务开始和停止。

+0

你能为我详细一点吗?我不认为这是我想要的......这是在显示加载消息后强行等待一段时间。 –

+0

这是干什么的,在当前舞台上设置一个MODAL窗口,以便用户不能执行任何其他操作。您可以在任务的call()方法中加载新的视图/阶段/过程。如果您想要完全模式化而不仅仅是阶段,请将initModality设置为Modality.APPLICATION_MODAL。如果你在主FX线程上执行逻辑,那么UI将会被阻塞。call()方法中所做的任何事情都将发生在后台线程上,并且UI由于模态ProgressDialog而被阻止。 –

相关问题