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();
コードを更新し、プログラムが動作しますが、問題は、インジケータが早すぎる – pebble
単なるテストのために、loginTaskに ''のThread.sleep(5000)を追加してみ停止しています。 – MBec
これはうまくいきますが、私はThread.sleepがインジケータを実行すると5000msの間ポーズしてから回転し続けます。それを常に回転させる方法はありますか? – pebble