TreeTableView から (その親 TreeItem の子リストから) TreeItem のリンクを解除し、前の兄弟の新しい子としてリンクして戻す簡単なコードがあります。たとえば、構造が次の場合:
A
B
C
D
E
次に、D の「降格」の後、次のように表示されます。
A
B
C
D
E
操作の後、再帰的な出力ルーチンによって、子リストが正しく作成されたことが示されます。ただし、表示は少なくとも完全には更新されません。ノード D は、C の兄弟ではなく、B と E の兄弟として表示されます。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
newSiblings
デバッガー(Eclipse)または再帰的な印刷方法で調べると、それが正しいことがわかります。折りたたみ/展開すると正しい値が表示されるため、明らかにそうです。単純にノードを削除する (つまり、上記の newSiblings.add をコメント化する) などのその他の変更は正しく表示されます。削除されたノードは、強制的に更新するための人為的な展開/折りたたみを必要とせずに、すぐに削除されたものとして表示されます。ツリー構造が変わるObservableList
というのは全体の考え方ではないでしょうか。TreeTableView
私は何が欠けていますか?:)
何か案は?ありがとう!