Java 如何更新TreeTableView数据?
我正在编写一个应用程序,它可以测量在任务上花费的时间。我有TableTreeView,其中包含项目及其任务的详细信息 这就是它的样子: 我想让duration的列在任务运行时更新它的值。此外,还应更新项目工期 这是我的模型:Java 如何更新TreeTableView数据?,java,javafx,Java,Javafx,我正在编写一个应用程序,它可以测量在任务上花费的时间。我有TableTreeView,其中包含项目及其任务的详细信息 这就是它的样子: 我想让duration的列在任务运行时更新它的值。此外,还应更新项目工期 这是我的模型: public abstract class SimpleTask{ abstract Duration getDuration(); } public class Task extends SimpleTask{ Duration duration;
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);
}
公共抽象类SimpleTask{
抽象Duration getDuration();
}
公共类任务扩展了SimpleTask{
持续时间;
@凌驾
公共持续时间getDuration(){
返回时间;
}
公共启动(){
//每秒更新持续时间值;
}
}
公共类项目扩展了SimpleTask{
列出任务;
@凌驾
公共持续时间getDuration(){
returntasks.stream()
.map(任务::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());
}
});
durat.setCellValueFactory(新回调(){
@凌驾
公共ObservableValue调用(TreeTableColumn.CellDataFeatures SimpleTaskDurationCellDataFeatures){
返回新的SimpleObject属性(SimpleTaskDurationCellDataFeatures.getValue().getValue().getDuration());
}
});
如何使duration列在任务运行时更新其值?只需在
SimpleTask
中添加一个ReadOnlyObject属性
,并使用它,而不是由cellValueFactory
创建的新的SimpleObject属性
。否则您需要“手动触发”使用TableView更新表。每次修改持续时间时刷新(从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();
}
}
公共抽象类SimpleTask{
公共摘要Duration getDuration();
公共摘要ReadOnlyObjectProperty durationProperty();
}
公共类任务扩展了SimpleTask{
私有最终ReadOnlyObjectWrapper duration=新的ReadOnlyObjectWrapper();
@凌驾
公共持续时间getDuration(){
返回duration.get();
}
public ReadOnlyObjectProperty durationProperty(){
返回持续时间。getReadOnlyProperty();
}
公开作废开始(){
//使用此.duration.set(newDuration)每秒更新一次duration值;
}
}
公共类项目扩展了SimpleTask{
私人最终可观察任务;
私有最终只读对象包装器持续时间;
公共工程(){
this.duration=new ReadOnlyObjectWrapper();
this.tasks=FXCollections.observearraylist(t->newobserveable[]{t.durationProperty()});
this.duration.bind(Bindings.createObjectBinding(()
->tasks.stream()
.map(任务::getDuration)
.reduce(Duration.ZERO,Duration::plus),
这是"任务",;
}
@凌驾
公共持续时间getDuration(){
返回duration.get();
}
public ReadOnlyObjectProperty durationProperty(){
返回持续时间。getReadOnlyProperty();
}
}
durat.setCellValueFactory(新回调(){
@凌驾
公共ObservableValue调用(TreeTableColumn.CellDataFeatures simpleTaskDurationCellDataFeatures){
返回simpleTaskDurationCellDataFeatures.getValue().getValue().durationProperty();
}
});
请注意,您可以通过提取除start()之外的所有成员来减少代码重复
从任务
到另一个抽象类,添加受保护的
方法来访问属性本身,不仅是它的只读版本,还使用项目
扩展该类。只需将ReadOnlyObject属性
添加到SimpleTask
并使用它,而不是新的SimpleObject属性y
由cellValueFactory创建。否则,您需要使用TableView“手动触发”更新表。每次修改持续时间时刷新
(从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();
}
}
公共抽象类SimpleTask{
公共摘要Duration getDuration();
公共摘要ReadOnlyObjectProperty durationProperty();
}
公共类任务扩展了SimpleTask{
私有最终ReadOnlyObjectWrapper duration=新的ReadOnlyObjectWrapper();
@凌驾
公共持续时间getDuration(){
返回duration.get();
}
public ReadOnlyObjectProperty durationProperty(){
返回持续时间。getReadOnlyProperty();
}
公开作废开始(){
//使用此.duration.set(newDuration)每秒更新一次duration值;
}
}
公共类项目扩展了SimpleTask{
私人最终可观察任务;
私有最终只读对象包装器持续时间;
公共工程(){
this.duration=new ReadOnlyObjectWrapper();
this.tasks=FXCollections.observearraylist(t->newobserveable[]{t.durationProperty()});
this.duration.bind(Bindings.createObjectBinding(()
->tasks.stream()
.map(任务::getDuration)
.reduce(Duration.ZERO,Duration::plus),
这是"任务",;
}
@凌驾
公共持续时间getDuration(){
返回duration.get();
}
public ReadOnlyObjectProperty durationProperty(){
返回持续时间。getReadOnlyProperty();
}
}
durat.setCellValueFactory(新回调(){
@凌驾
公共ObservableValue调用(TreeTableColumn.CellDataFeatures simpleTaskDurationCellDataFeatures){
返回simpleTaskDurationCellDataFeatures.getValue().getValue().durationProperty();
}
});
请注意,通过将Task
中除start()
以外的所有成员提取到另一个抽象类,添加protected
方法来访问属性本身,而不仅仅是它的只读版本,并使用Project
扩展该类,可以减少代码重复