我正在编写用于衡量花在任务上的时间的应用程序。我有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());
}
});
如何在任务运行时使持续时间列更新其值?
答案 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
扩展该课程。