进度条完成加载后关闭gui窗口

时间:2016-12-22 04:13:55

标签: for-loop javafx progress-bar try-catch

我是java编程的新手,我遇到了一个问题,我遇到了问题。

我目前使用的代码(有效)正在加载进度条...但我希望加载窗口在进度条完成时关闭[与独立程序类似的效果]

我的舞台名称叫做welcome 进度条称为加载

这是我的代码:

final SimpleDoubleProperty prop = new SimpleDoubleProperty(0);

    load.progressProperty().bind(prop);
    load.prefWidthProperty().bind(start.widthProperty());

    new Thread(){
 @Override
 public void run(){                
      try {

           for(double i=0; i<=1; i+=0.01){
                prop.set(i); 
                Thread.sleep(100);

           }                   




      } catch (InterruptedException ex) {
           System.err.println("Error on Thread Sleep");

    }



 }

}开始();

我尝试在代码块的许多区域中包含for循环块和try-catch块之后的welcome.hide()或welcome.close()。

任何帮助将不胜感激

谢谢!

1 个答案:

答案 0 :(得分:0)

一个快速解决方案是使用Platform.runLater

方式1(不推荐):

new Thread(){
  @Override
  public void run(){                
      try {

           for(double i=0; i<=1; i+=0.01){           
              Platform.runLater( ()-> prop.set(i) );
              Thread.sleep(100);  
           }      

         Platform.runLater( ()-> window.close() );             

      } catch (InterruptedException ex) {
           System.err.println("Error on Thread Sleep");

    }

 }

为什么会这样?

  

因为您正在从外部线程和JavaFX修改SceneGraph   不允许这样做。

方式2)在JavaFX中正确的方式

我能做到的最好方法是什么?

最好的方法是使用Service + Task (+),这样就可以绑定ProgressBar progressProperty Service } progressProperty。只要Service结束或达到您想要的进度,您就可以关闭Stage。这里的选择是无限的,这是在JavaFX中执行此操作的正确方法。

  

此外,您必须使用Platform.runLater   修改SceneGraph

Service的示例骨架:

public class CustomService extends Service<Void> {

      public CustomService(){

      }

     @Override
     public void start(){

        super.start();
       //your code..

     }

     @Override
     public void stop(){

       super.stop();
       //your code...

     }


       @Override
        protected Task<Void> createTask() {
            return new Task<Void>() {
                @Override
                protected Void call() throws Exception {


               }
               return null;
            }
        }

   }