2011-07-06 4 views
3

DefaultMutableTreeNodeのサブクラスを含むDefaultTreeModelがあります。 isLeaf()をオーバーライドするだけで、ノードが展開されたときに子ノードが遅延ロードされるため、常にtrueが返されます。その後、ノードが崩壊すると、サーバーからの更新を登録解除したため、子を削除します(適切なtreeNodesRemovedイベントを発生させます)。子が削除された後にJTreeノードの 'expand'コントロールを表示しますか?

問題は、ユーザーがノードを折りたたんで子を削除した後、愚かな小さな拡張サークルが消えることです(しかし、その領域をクリックするとノードが拡張されます)。子どもが削除されたときに、常に拡大コントロールを表示するにはどうすればよいですか?

関連:Add 'expand' button to JTree node that has no children?。偽の子供を唯一の方法で追加していますか?

Expand control disappears after collapsing

+0

を提示しているうーん、あなたは何をやったかと、明らかに間違って何もない、私の提案は、モデル(ひいては木)通知するさまざまな方法を試してみることですノードが変更されたことを示します。たとえば、 'TreeExpansionListener.treeCollapsed'メソッドで' defaultMutableTreeNode.removeAllChildren() 'と' defaultTreeModel.reload(defaultMutableTreeNode) 'を呼び出すことができます。 –

+0

子供の摘出の詳細な説明はできますか?なぜこれが必要ですか? 「サーバーからの更新の登録を解除したので」私には分かりません。 – MockerTim

+0

@MockerTim、ノードが展開されると、自分のサーバーに子をフェッチし、その直接の子のイベントの挿入/削除/変更を要求するリクエストをサーバーに送信します。ノードが崩壊すると、サーバーへの要求を送信して子ノードへの更新の受信を停止します。それから私はすべての子供を取り除きます、私は失効する可能性のあるノードを守りたくないからです。 – yonran

答えて

0

私はそれをやった方法は、子が削除されたとき、私は偽の子供と拡張リスナーを追加です。偽の子を持つノードが展開されるという通知を受け取ると、私は偽の子を実際に遅延読み込みの子と置き換えます。

この方法でノードは常に子供を持ち、コントロールを拡張するには、常に

+0

それは私がやったことです:偽の子供を作成し、treeWillExpandでそれを削除します。私はisLeafが十分であることを望んでいたが、明らかにそうではない。 – yonran

関連する問題