0

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私は何が欠けていますか?:)

何か案は?ありがとう!

4

0 に答える 0