我有一些简单的代码将 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
我错过了什么?:)
有任何想法吗?谢谢!