CellFactory在后台计算值

时间:2017-10-29 21:52:04

标签: javafx tableview

我想在后台异步计算表格的单元格内容。我提出了以下解决方案:

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中。再次,双击该单元格即可修复该问题。

我知道这些工厂被表列重用来计算不同项目的单元格内容,我认为错误与这一事实有关。

enter image description here

编辑:当我将service字段移至TableCell时,计算错误似乎已修复,不过,切换值问题仍然存在。

找到MWE here。它实际上不是工作示例,因为它不会重现问题。我想细胞工厂工作正常,我在其他地方做错了。

0 个答案:

没有答案