当前位置: 首页 > 知识库问答 >
问题:

自动更新嵌套项的TreeView

湛鸿雪
2023-03-14

我有一个目标,它有一个目标清单。一个目标有一系列的策略。一个战略有一个战术清单。战术有一个任务列表。

我希望能够在树视图中显示这一点,我希望树与项目同步。也就是说,如果我删除一个目标,该目标及其子目标也将从TreeView中消失。

/**
 * 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);
public PlanItem() {
    CustomBinding.bindLists(treeItem.getChildren(), childPlanItems, PlanItem::getTreeItem);
}
/**
 * Binds a source list's elements to a destination list. Any changes made in
 * the source list will reflect in the destination list.
 *
 * @param <SRC> The source list's object type.
 * @param <DEST> The destination list's object type.
 * @param dest The destination list that will be bound to the src list.
 * @param src The source list to watch for changes, and propagate up to the
 * destination list.
 * @param transformer A function that will transform a source list data
 * type, A, into a destination list data type, B.
 */
public static <SRC extends Object, DEST extends Object> void bindLists(
        ObservableList<DEST> dest, ObservableList<SRC> src, Function<SRC, DEST> transformer) {
    /*Add the initial data into the destination list.*/
    for (SRC a : src) {
        dest.add(transformer.apply(a));
    }
    /*Watch for future data to add to the destination list. Also watch for removal
     of data form the source list to remove its respective item in the destination
     list.*/
    src.addListener((ListChangeListener.Change<? extends SRC> c) -> {
        while (c.next()) {
            /*Watch for removed data.*/
            if (c.wasRemoved()) {
                for (SRC a : c.getRemoved()) {
                    int from = c.getFrom();
                    dest.remove(from);
                }
            }
            /*Watch for added data.*/
            if (c.wasAdded()) {
                for (SRC a : c.getAddedSubList()) {
                    int indexAdded = src.indexOf(a);
                    dest.add(indexAdded, transformer.apply(a));
                }
            }
        }
    });
}

计划是创建一个包装PlanItem的TreeItem。然后,将TreeItem的子TreeItems与PlanItem的子PlanItems同步。对于每个嵌套的PlanItem也会递归地重复这样的操作。

共有1个答案

陆伟
2023-03-14

您的BindLists方法非常通用,可以在不引用当前使用的列表(即不引用PlanItem类)的情况下编写(就像您现在使用的那样)。所以我可能会挺过来

public static <SRC, DEST> void bindLists(ObservableList<DEST> dest, ObservableList<SRC> src, ...) { ... }

但是请注意,映射函数必须能够应用于src的元素(因此它必须作用于src的元素所属于的类型),并生成可以放在dest列表中的内容。因此,使用函数 可能限制太大。试试看

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)

其中tplanitem或任何子类,并且应该易于使用。

 类似资料:
  • 我有一个dynamodb表,它的一个属性包含一个嵌套的映射,我想更新一个特定的库存项目,该项目通过一个过滤器表达式进行过滤,从而从该映射中生成一个项目。 如何编写一个更新表达式来更新位置到名称=欧宝的项目的“就位三”,标签包括“x1”(也可能是f3)?这应该只更新第一个列表元素位置属性。

  • 我想在具有指定 URL 的相应文档中将嵌套的“已爬行”更新为 True。 我对mongodb相当陌生,我似乎无法弄清楚这一点,非常感谢任何帮助。

  • 我有以下架构 我想为创建静态方法,以便根据给定的更新 我的情况与建议的复制相似,但不相同,因为那里的家伙知道所有的,而我不知道。

  • 这是我的架构:

  • 我实现了两个 entites。规则实体和 RestCall 实体如下所示: RuleEntity RestCallEntity 我在 json 终结点中收到一条规则。比我将收到的 json 规则转换为规则实体并调用 当我只是更改规则的名称时,更新工作正常。但是当我更改它的名称时,它看起来像Hibernate尝试创建一个新的重新调用,即使它已经有一个ID。我得到以下异常。 原因:ruleentity

  • 我正在尝试更新嵌套数组中的值,但无法使其工作。 我的对象是这样的 提前谢谢!