0

我有一些简单的代码将 TreeItem 从 TreeTableView (从其父 TreeItem 的子列表)中取消链接,然后将其链接回作为前一个兄弟的新子。例如,如果结构是:

A

      B

          C

      D

      E

然后在 D 的“降级”之后,您应该看到:

A

      B

          C

          D

      E

操作后,递归打印例程显示子列表已正确构建。但是,显示没有得到更新,至少没有完全更新。我仍然将节点 D 视为 B 和 E 的兄弟,而不是 C 的兄弟。折叠和重新展开 B 可以更正显示。执行此操作的代码如下所示(其中“item”是被降级的 TreeItem,上面的“D”):

        TreeItem<FldViewNode> parent = item.getParent ();
        List<TreeItem<FldViewNode>> siblings = parent.getChildren ();   // TreeItems at same level as ones being deleted
        // New parent will be previous sibling of us.

        int itemIx = siblings.indexOf (item);   // This is where we are in parent's children
        if (itemIx <= 0)
        {
            System.out.printf("Cannot demote first child");
            return;
        }

        siblings.remove (itemIx);   // Remove this item from parent's children's list

        // Insert back as new last children of previous sibling of item
        TreeItem<FldViewNode> newParent = siblings.get (itemIx - 1);    // Sibling just above item to demote
        List<TreeItem<FldViewNode>> newSiblings = newParent.getChildren (); // TreeItems at same level as ones being demoted

        newSiblings.add (item); // Insert just after new parent's existing children as a new child

在调试器 (Eclipse) 中或通过递归打印方法检查newSiblings表明它是正确的,而且显然是正确的,因为折叠/展开显示了正确的值。其他一些更改,例如简单地删除节点(即,注释掉上面的 newSiblings.add)确实显示正确 - 删除的节点显示为立即消失,无需人工展开/折叠强制刷新。看到树结构ObservableList的变化不是整个想法吗?TreeTableView我错过了什么?:)

有任何想法吗?谢谢!

4

0 回答 0