Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何更新TreeTableView数据?_Java_Javafx - Fatal编程技术网

Java 如何更新TreeTableView数据?

Java 如何更新TreeTableView数据?,java,javafx,Java,Javafx,我正在编写一个应用程序,它可以测量在任务上花费的时间。我有TableTreeView,其中包含项目及其任务的详细信息 这就是它的样子: 我想让duration的列在任务运行时更新它的值。此外,还应更新项目工期 这是我的模型: public abstract class SimpleTask{ abstract Duration getDuration(); } public class Task extends SimpleTask{ Duration duration;

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

这就是它的样子:

我想让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
扩展该类,可以减少代码重复