この回答は、ダニエルの回答と同じ概念を使用しています。
同封されているのは、 Task javadocの Partial Result サンプルのコピーです(現在 Java 8 javadoc に埋め込まれている構文エラーを修正し、より具体的なジェネリック型を追加しています)。その変更を使用できます。
例外を partialResults コレクションに配置します。あなたのケースでは、タスクから例外のリストを返す必要はありませんが、代わりに、例外を表示する UI コントロールにそれらを配置できます (例外表示用ListView
のなどCellFactory
)。partialResults コレクションは常に更新され、JavaFX UI スレッドでアクセスされるため、同期する必要がないことに注意してください (更新はPlatform.runLater()
Daniel のソリューションと同様の呼び出しを介して行われます)。
public class PartialResultsTask extends Task<ObservableList<Rectangle>> {
private ReadOnlyObjectWrapper<ObservableList<Rectangle>> partialResults =
new ReadOnlyObjectWrapper<>(
this,
"partialResults",
FXCollections.observableArrayList(
new ArrayList<>()
)
);
public final ObservableList<Rectangle> getPartialResults() {
return partialResults.get();
}
public final ReadOnlyObjectProperty<ObservableList<Rectangle>> partialResultsProperty() {
return partialResults.getReadOnlyProperty();
}
@Override
protected ObservableList<Rectangle> call() throws Exception {
updateMessage("Creating Rectangles...");
for (int i = 0; i < 100; i++) {
if (isCancelled()) break;
final Rectangle r = new Rectangle(10, 10);
r.setX(10 * i);
Platform.runLater(() -> partialResults.get().add(r));
updateProgress(i, 100);
}
return partialResults.get();
}
}
監視可能なプロパティを更新するとき、タスクは最初に更新が FX アプリケーション スレッドで発生しているかどうかを確認します。存在する場合は、即時更新を行います。そうでない場合は、呼び出しで更新をラップしPlatform.runLater()
ます。これがどのように行われるかを理解するには、タスクのソース コードを参照してください。
おそらく、一連の一般的な同時実行対応プロパティを定義することは可能ですが、JavaFX はそのような機能をコアに提供していません。実際、その必要はありません。javafx.concurrent パッケージを除いて、JavaFX はシングルスレッドの UI フレームワークです。