这个答案使用与丹尼尔的答案相同的概念。
随附的是 Task javadoc 中部分结果示例的副本(修复了当前嵌入在 Java 8 javadoc 中的语法错误并添加了更具体的泛型类型)。您可以使用修改。
将异常放在部分结果集合中。对于您的情况,您不需要从任务返回异常列表,而是可以将它们放在显示异常的某个 UI 控件中(如带有异常的显示)。请注意,部分Results集合不需要同步,因为它总是在JavaFX UI线程上更新和访问(更新是通过类似于Daniel的解决方案的调用进行的)。ListView
CellFactory
Platform.runLater()
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框架。