1つのスレッドで実行される複数のタスクがあります。それはうまく動作し、対応するtablecellプログレスバーは期待通りに更新されます。私がそれらを実行する前に、UI上のすべてのボタンを無効にしたい(これは私のenableControls
メソッドです)。最後のタスクが実行されたら、ボタンを再び有効にします。JavaFX:ExecutorService.awaitTerminationは、バインドされたプロパティを通じてUIを更新しません。
シャットダウンを追加して、awaitTermination
を追加しようとしましたが、すべてが完了したとき以外はUIが更新されません。
ExecutorService exec = Executors.newSingleThreadExecutor(r -> {
Thread t = new Thread(r);
t.setDaemon(true);
return t ;
});
enableControls(false);
for (Segment seg : selectedItems) {
Task loadingTask = new Task<Void>() {
@Override
public Void call() {
for (int i = 1; i <= 100; i++) {
updateProgress(i, 100);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
};
seg.progressBarProperty().bind(loadingTask.progressProperty());
loadingTask.setOnSucceeded(e -> seg.progressBarProperty().unbind());
loadingTask.setOnFailed(e -> {
loadingTask.getException().printStackTrace();
enableControls(true);
});
exec.submit(loadingTask);
}
exec.shutdown();
try {
exec.awaitTermination(1, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("test");
enableControls(true);
は、代替的に、私は現在のタスクが最後であるかどうかを決定すると考える(ループでこれ以上SEG)とsetOnSucceeded
にUIコントロールを再度有効。最小限に抑えるためにエレガントではない。
UIが(バウンド値を介して)更新されない理由 - これはawaitTermination
の制限ですか?
完璧!私が持っていた1つの質問はrunningPropertyにバインドするという提案でした:呼び出しボタンだけを無効にする必要がある場合はうまくいきますが、私の場合はステージ上のすべてのボタンとテキストフィールドを無効にする必要があります。私はそれらをすべてグループ化し、disabledPropertyを使用する方法を見つけることができませんでした。代わりに、タスクを実行する前後に、すべてのsetDisableまたはsetEditableを切り替えるメソッドを使用しました。 –