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哦,等等,我想我明白了。函数将接受自身或自身超类型的任何内容。它将接受
目标,但它也将采用
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)