如何更新TreeTableView数据?

时间:2016-11-10 12:19:14

标签: java javafx

我正在编写用于衡量花在任务上的时间的应用程序。我有TableTreeView,其中包含项目及其任务的详细信息。

它的外观如下:TableTreeViewImage

我想要的是让持续时间列在任务运行时更新其值。还应更新项目持续时间。

这是我的模特:

public abstract class SimpleTask{
    abstract Duration getDuration();
}

public class Task extends SimpleTask{
    Duration duration;

    @Override
    public Duration getDuration(){
        return duration;
    }

    public start(){
        //update duration value every second;
    }

}


public class Project extends SimpleTask{
    List<Task> tasks;

    @Override
    public Duration getDuration(){
        return tasks.stream()
                .map(Task::getDuration)
                .reduce(Duration.ZERO,Duration::plus);
        }

我尝试使用方法getDuration()绑定duration列,但是需要刷新TableTreeView以更新此列中的值。

durat.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures<SimpleTask, Duration>, ObservableValue<Duration>>() {
          @Override
          public ObservableValue<Duration> call(TreeTableColumn.CellDataFeatures<GeneralTask, Duration> SimpleTaskDurationCellDataFeatures) {
              return new SimpleObjectProperty<Duration>(SimpleTaskDurationCellDataFeatures.getValue().getValue().getDuration());
          }
      });

如何在任务运行时使持续时间列更新其值?

1 个答案:

答案 0 :(得分:0)

只需将ReadOnlyObjectProperty<Duration>添加到SimpleTask并使用它,而不是SimpleObjectProperty创建的新cellValueFactory。否则,每次修改持续时间时,您都需要使用TableView.refresh(从javafx 8u60开始)“手动触发”更新表:

public abstract class SimpleTask {

    public abstract Duration getDuration();

    public abstract ReadOnlyObjectProperty<Duration> durationProperty();
}

public class Task extends SimpleTask {

    private final ReadOnlyObjectWrapper<Duration> duration = new ReadOnlyObjectWrapper<>();

    @Override
    public Duration getDuration() {
        return duration.get();
    }

    public ReadOnlyObjectProperty<Duration> durationProperty() {
        return duration.getReadOnlyProperty();
    }

    public void start() {
        //update duration value every second using this.duration.set(newDuration);
    }

}

public class Project extends SimpleTask {

    private final ObservableList<Task> tasks;

    private final ReadOnlyObjectWrapper<Duration> duration;

    public Project() {
        this.duration = new ReadOnlyObjectWrapper<>();
        this.tasks = FXCollections.observableArrayList(t -> new Observable[]{t.durationProperty()});
        this.duration.bind(Bindings.createObjectBinding(()
                -> tasks.stream()
                .map(Task::getDuration)
                .reduce(Duration.ZERO, Duration::plus),
                this.tasks));
    }

    @Override
    public Duration getDuration() {
        return duration.get();
    }

    public ReadOnlyObjectProperty<Duration> durationProperty() {
        return duration.getReadOnlyProperty();
    }

}
durat.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures<SimpleTask, Duration>, ObservableValue<Duration>>() {
    @Override
    public ObservableValue<Duration> call(TreeTableColumn.CellDataFeatures<SimpleTask, Duration> simpleTaskDurationCellDataFeatures) {
        return simpleTaskDurationCellDataFeatures.getValue().getValue().durationProperty();
    }
});

请注意,您可以通过将start()之外的所有成员从Task提取到另一个抽象类来减少代码重复,添加protected方法来访问属性本身,而不仅仅是readonly版本并使用Project扩展该课程。