5

ツリー ノードが計算に時間がかかる子を持つ可能性がある Java ツリーを作成しています (この場合はファイル システムであり、接続されたドライブからファイルのリストを取得できないネットワーク タイムアウトが発生する可能性があります)。

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

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

  2. からの子の正確な数はgetChildCount()、潜在的に高価な操作を実行する必要があります

  3. の値を偽造するとgetChildCount()、ツリーは子の列挙を要求する前に、その数の子ノードにのみスペースを割り当てます。(「1」を返すと、さらに多くの子供がいるにもかかわらず、1 人の子供しか表示されません)

子の列挙には費用と時間がかかる可能性がありますが、それは問題ありません。しかし、私はgetChildCount()子供の正確な数を知る必要があることに満足していません.

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

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

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

4

4 に答える 4

3

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

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

于 2008-09-30T21:50:46.863 に答える
0

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

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

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

ノードのhasChildren機能またはオーバーライドが必要な場合getChildCountは、ブール値で十分であり、削除の場合に階層全体を上に移動する必要はありません。または、バックリンクを削除して、削除操作の精度が低下したと言うこともできます。インターフェイスはTreeNode実際には削除操作を提供するように強制しませんが、とにかく削除操作が必要になる可能性があります。

まあ、それは取引です。事前に計算された正確な値を考え出すために、あなたはある種のバックリンクを保持しなければならないでしょう。hasHadChildrenそうでない場合は、メソッドまたはもっと面白いものを呼び出す方がよいでしょうisVirgin

于 2008-09-30T20:57:01.127 に答える
0

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

  • Lorenzo Boccaccia が言ったように、TreeWillExpandListenerを使用します

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

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

于 2008-10-01T19:42:11.187 に答える
0

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

于 2008-09-30T20:16:42.470 に答える