Java TreeNode:getChildCountが高価な操作を行うのを防ぐ方法は?

StackOverflow https://stackoverflow.com/questions/154791

  •  03-07-2019
  •  | 
  •  

質問

ツリーノードが計算に長い時間がかかる子を持つJavaツリーを書いています(この場合、それはファイルシステムであり、ネットワークタイムアウトにより、添付ファイルからファイルのリストを取得できない場合があります)ドライブ)。

私が見つけている問題はこれです:

  1. getChildCount()は、ユーザーがツリーの特定のブランチを開くことを明確に要求する前に呼び出されます。これは JTree がノードの横に+アイコンを表示するかどうかを知るために行われたと思います。

  2. getChildCount()の子の正確なカウントには、潜在的に負荷の高い操作を実行する必要があります

  3. getChildCount()の値を偽造した場合、ツリーは、子の列挙を要求する前に、その多くの子ノードにのみスペースを割り当てます。 (「1」を返すと、まだ1つしかリストされていませんが、子が1つだけ表示されます)

子の列挙は高価で時間がかかる可能性がありますが、それで問題ありません。しかし、 getChildCount()が正確な子の数を知る必要があるので大丈夫ではありません。

これを回避する方法はありますか?

追加:もう1つの問題は、ノードの1つがフロッピードライブを表している場合(古風!)、ユーザーがファイルを要求する前にドライブがポーリングされることです。ドライブにディスクがない場合、システムエラーが発生します。

更新:残念ながら、 TreeWillExpand リスナーを実装することは解決策ではありません。これにより、展開を拒否できますが、表示されるノードの数は、 TreeNode.getChildCount()によって返される値によって制限されます。

役に立ちましたか?

解決 4

ソリューションにはいくつかの部分があります:

  • Lorenzo Boccacciaのように、 TreeWillExpandListener

  • また、ツリーでnodesWereInsertedを呼び出す必要があるため、適切な数のノードが表示されます。 このコードを見る

  • 子の数がわからない場合、TreeNode.getChildCount()は少なくとも1を返す必要があります(0を返すことはできません)

他のヒント

http://java.sun.com /docs/books/tutorial/uiswing/components/tree.html#data

少し下にスクロールすると、jtreeの遅延読み込みノードを作成する方法に関する正確なチュートリアルがあり、例とドキュメントが揃っています

それが完全に適用できるかどうかはわかりませんが、最近、通常は子のリストを調べる必要があるメソッドへの回答を事前計算することで、低速ツリーの問題を回避しました。子が追加、削除、または更新されたときにのみ再計算します。私の場合、いくつかのメソッドは、各ノードの「保存されているバイト数」などを把握するために、ツリーを再帰的にたどる必要がありました。

計算に費用がかかるデータ構造の特定の機能への多くのアクセスが必要な場合は、事前に計算するのが理にかなっています。

TreeNodeの場合、これは、TreeNodeが子カウントを保存する必要があることを意味します。もう少し詳しく説明すると、ノード n0 を作成すると、このノードの子カウント( cc )は0になります。ノード n1 の子として、 n1.cc + cc ++ を使用します。

トリッキーなビットは削除操作です。親へのバックリンクを保持し、現在のノードの cc を差し引くために階層を上る必要があります。

ノードに hasChildren 機能を追加したい場合、または getChildCount をオーバーライドしたい場合は、ブール値で十分であり、全体を上に強制することはありません削除の場合の階層。または、バックリンクを削除して、削除操作の精度が失われたとだけ言うこともできます。 TreeNode インターフェースは、実際には削除操作の提供を強制しませんが、いずれにしても削除操作が必要になるでしょう。

まあ、それは契約です。事前計算された正確な値を見つけるために、何らかの種類のバックリンクを保持する必要があります。そうでない場合は、メソッド hasHadChildren またはより面白い isVirgin を呼び出した方がよいでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top