2017-02-21 12 views
1

uiを完全に更新した後でのみ進行状況インジケータを停止したい。しかし、uiメソッドで最後のコード行を実行した後に停止します。インジケータとして動作するはず:javafxで進行状況インジケータを実行する方法

1> Start the progress 
2> Run the progress until all nodes are added to the scene 
3> Stop after completion 

iは更新方法は、iがスレッドにBorderPaneを通過し、インジケータが停止した後のコードの最後の行であるgridpaneを、その中心設定です。 loginTask、アプリケーションスレッド内で起動すると、インジケータは回転しません!

borderpane.setCenter(gpane); 

UI法

{ 
Loading loadBar = new Loading(stage); 
Task<Boolean> loginTask= checkCredTask(); 
loginTask.setOnSucceeded(value -> { 
      loadBar.hideProgress(); }); 

loadBar.startTask(loginTask); 
(new Thread(loginTask)).start(); 

} 

プログレスバー

public class Loading{ 

    private static Stage stage; 
    private static ProgressIndicator p; 
    private static Alert alert; 

    public Loading(Stage s){ 
     stage=s; 
     p=new ProgressIndicator(); 
     alert = new Alert(AlertType.NONE); 

    } 


    public void startTask(Task<Boolean> cm){ 
     if(p != null){ 
      p.setProgress(-1); 
      p.progressProperty().unbind(); 
      p.progressProperty().bind(cm.progressProperty()); 
      alert.initOwner(stage); 
      alert.getDialogPane().setStyle("-fx-background-color:rgba(0,0,0,0);"); 
      alert.getDialogPane().getScene().setFill(Color.TRANSPARENT); 
      alert.initStyle(StageStyle.TRANSPARENT); 
      alert.getDialogPane().setContent(p); 
      alert.show(); 
     } 
    } 


    public void hideProgress(){ 
     alert.setResult(ButtonType.CLOSE); 
    } 
} 

タスク

private Task<Boolean> checkCredTask() { 
     Task<Boolean> loginTask = new Task<Boolean>() { 
     @Override 
     public Boolean call() { 
      Boolean result = false; 
      int flag = verifyCredential(); 
      if (flag == 1) { 
       loadUI(); 
       try { 
        Thread.sleep(5000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       result = true; 
      } else if (flag == 2) { 
       result = false; 
      } 
      return result; 
     } 
    }; 
    return loginTask; 
    } 

負荷UI法

ExecutorService execsrv = Executors.newSingleThreadExecutor(); 
      execsrv.execute(new AdminUI(stage,pane,mb)); 
      execsrv.shutdown(); 

答えて

0

あなたのコードはコンパイルされません。 Task<Boolean> loginTaskは、抽象的なcall()メソッドよりも優先しません。あなたはcall()方法で

ExecutorService execsrv = Executors.newSingleThreadExecutor(); 
execsrv.execute(new AdminUI(stage,pane,mb)); 
execsrv.shutdown(); 

をラップする場合でも、あなたは別のタスク内に新しいタスクを実行しているので、それは、意味がありません。 new AdminUI(stage,pane,mb)は、長い実行中のプロセスがあるとbooleanを返す

Assumigことを、あなたはこのような方法でそれを行う必要があります:私が言ったように、あなたはloginTaskAdminUIタスクを実行している

Task<Boolean> loginTask = new Task<Boolean>() { 
    @Override 
    protected Boolean call() throws Exception { 
     // Start the UI 
     AdminUI ui = new AdminUI(stage, pane, mb); 
     return ui.getBooleanValue(); 
    } 
}; 

EDIT何がノーを作りますセンス。今のところあなたはログインタスクだけを待っていますが、AdminUIタスクは待ちません。ログインタスクがAdminUIより速く終了するため、インジケータが早期に停止します。 AdminUIを別のTaskに抽出します。これは疑似コードなので、あなた自身でそれをしなければなりません。

Task<Boolean> loginTask= checkCredTask(); 
loginTask.setOnSucceeded(value -> { 
    //****** THIS IS PSEUDO CODE *********** 
    //start AdminUITask 
    //AdminUITask.setOnSucceeded(value -> { 
     //loadBar.hideProgress(); 
    //}); 
}); 
+0

コードを更新し、プログラムが動作しますが、問題は、インジケータが早すぎる – pebble

+0

単なるテストのために、loginTaskに ''のThread.sleep(5000)を追加してみ停止しています。 – MBec

+0

これはうまくいきますが、私はThread.sleepがインジケータを実行すると5000msの間ポーズしてから回転し続けます。それを常に回転させる方法はありますか? – pebble

関連する問題