Java 自动更新嵌套项的树视图
我有一个目标,它有一个目标清单。目标有一系列策略。战略有一系列战术。战术有一系列任务 我希望能够在树视图中显示这一点,并且我希望树与项目同步。也就是说,如果我删除一个目标,该目标及其子目标也将从树视图中消失 到目前为止,这就是我一直在尝试的Java 自动更新嵌套项的树视图,java,inheritance,javafx,treeview,javafx-8,Java,Inheritance,Javafx,Treeview,Javafx 8,我有一个目标,它有一个目标清单。目标有一系列策略。战略有一系列战术。战术有一系列任务 我希望能够在树视图中显示这一点,并且我希望树与项目同步。也就是说,如果我删除一个目标,该目标及其子目标也将从树视图中消失 到目前为止,这就是我一直在尝试的 /** * The base class for all PlanItems, which include ActionItems down to * ActionTasks, and Objectives down to Tasks. * * @a
/**
* The base class for all PlanItems, which include ActionItems down to
* ActionTasks, and Objectives down to Tasks.
*
* @author Toni-Tran
*/
public class PlanItem implements Comparable<PlanItem> {
protected ObservableList<PlanItem> childPlanItems = FXCollections
.observableArrayList();
protected TreeItem<PlanItem> treeItem = new TreeItem<>(this);
我正在使用自定义绑定,它将两个不同对象的列表绑定在一起。(或者,我可以使用EasyBind)
/**
*将源列表的元素绑定到目标列表。有什么变化吗
*源列表将反映在目标列表中。
*
*@param源列表的对象类型。
*@param目标列表的对象类型。
*@param dest将绑定到src列表的目标列表。
*@param src查看源列表以查看更改,并向上传播到
*目的地列表。
*@param transformer将转换源列表数据的函数
*将类型A输入到目标列表数据类型B中。
*/
公共静态void绑定列表(
可观察列表dest、可观察列表src、功能转换器){
/*将初始数据添加到目标列表中*/
对于(SRC a:SRC){
目的添加(变压器应用(a));
}
/*注意将来要添加到目标列表的数据。同时注意删除
从源列表中删除其在目标中的相应项
名单*/
src.addListener((ListChangeListener.Change您的bindLists
方法非常通用,并且可以编写(正如您现在所拥有的)而无需参考您现在正在使用的列表(即,无需参考PlanItem
类)。因此,我可能只需要编写它
public static <SRC, DEST> void bindLists(ObservableList<DEST> dest, ObservableList<SRC> src, ...) { ... }
现在你可以打电话了
bindLists(ObservableList<TreeItem<PlanItem>>, ObservableList<T>, PlanItem::getTreeItem)
绑定列表(ObservableList、ObservableList、PlanItem::getTreeItem)
其中
T
是PlanItem
或任何子类,应该很容易使用。为什么我必须给函数参数一个下限?为什么不扩展?您实际上想要传递的函数是函数
(因为您在PlanItem
类中定义它,使用this->new TreeItem(…)
)如果这是作用于一个元素,比如说一个可观察列表
,那么函数(PlanItem
)的参数类型是您给它的实际值的超类(目标
)…列表的元素必须可分配给函数的类型。函数的返回类型必须分配给目标列表的类型,因此您可以在那里使用extends
。function哦,等等,我想我明白了。函数将接受自身或自身超类型的任何内容。它将接受目标例如,code>,但它也将采用PlanItem
。然后将其转换为DEST
对象或DEST
的子类,然后再将其添加到列表中。我说得对吗?
public static <SRC, DEST> void bindLists(ObservableList<DEST> dest, ObservableList<SRC> src, ...) { ... }
public static <SRC, DEST> void bindLists(ObservableList<DEST> dest, ObservableList<SRC> src,
Function<? super SRC, ? extends DEST> transformer) { ... }
bindLists(ObservableList<TreeItem<PlanItem>>, ObservableList<T>, PlanItem::getTreeItem)