首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何更新TreeTableView数据?

如何更新TreeTableView数据?
EN

Stack Overflow用户
提问于 2016-11-10 12:19:13
回答 1查看 429关注 0票数 1

我正在编写一个应用程序,用来测量花在任务上的时间。我有TableTreeView,它包含项目及其任务的详细信息。

这就是它的样子:TableTreeViewImage

我想要的是,在任务运行时,创建工期列,更新其值。此外,应更新项目期限。

这是我的模型:

代码语言:javascript
运行
复制
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()方法绑定工期列,但是需要刷新TableTreeView以更新该列中的值。

代码语言:javascript
运行
复制
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());
          }
      });

当任务正在运行时,如何使工期列更新其值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-10 12:42:29

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

代码语言:javascript
运行
复制
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();
    }

}
代码语言:javascript
运行
复制
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方法来访问属性本身,不仅是只读版本,还可以用Project扩展该类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40527468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档