我想在后台异步计算表格的单元格内容。我提出了以下解决方案:
public abstract class AsynchronousCellFactory<E, T> implements Callback<TableColumn<E, T>, TableCell<E, T>> {
@Override
public TableCell<E, T> call(final TableColumn<E, T> param) {
final TableCell<E, T> cell = new TableCell<E, T>() {
private Service<T> service;
@Override
public void updateItem(final T item, final boolean empty) {
super.updateItem(item, empty);
if (service != null) {
service.cancel();
}
if (empty || this.getTableRow() == null || this.getTableRow().getItem() == null) {
setText(null);
} else {
setText("Calculating..");
final E rowDataItem = (E) this.getTableRow().getItem();
service = new Service<T>() {
@Override
protected Task<T> createTask() {
return getTask(rowDataItem);
}
};
service.setOnSucceeded(e -> {
setText(e.getSource().getValue().toString());
});
service.setOnFailed(e -> {
final Throwable t = e.getSource().getException();
setText(t.getLocalizedMessage());
});
service.start();
}
}
};
return cell;
}
protected abstract Task<T> getTask(E rowDataItem);
}
我几乎在所有列中使用此工厂来计算不同的值。
但这并不是很好。
我经常看到单元格内容说计算。当我双击那个明显触发重绘的单元格时,会出现正确的值。
此外,更糟糕的是,我发现有时单元格内容会在列之间“切换”:stringA
应该在columnA
中,例如在comlumnB
中。再次,双击该单元格即可修复该问题。
我知道这些工厂被表列重用来计算不同项目的单元格内容,我认为错误与这一事实有关。
编辑:当我将service
字段移至TableCell
时,计算错误似乎已修复,不过,切换值问题仍然存在。
找到MWE here。它实际上不是工作示例,因为它不会重现问题。我想细胞工厂工作正常,我在其他地方做错了。