gpt4 book ai didi

java - 如何更新TreeTableView数据?

转载 作者:太空宇宙 更新时间:2023-11-04 12:04:38 25 4
gpt4 key购买 nike

我正在编写用于测量任务花费时间的应用程序。我有 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() 绑定(bind)持续时间列,但随后需要刷新 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());
}
});

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

最佳答案

只需添加 ReadOnlyObjectProperty<Duration>SimpleTask并使用它代替新的 SimpleObjectPropertycellValueFactory 创建。否则您需要使用 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访问属性本身的方法,不仅是只读版本,还使用 ​​Project 扩展该类也是。

关于java - 如何更新TreeTableView数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40527468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com