2009-05-06 2 views
10

私はTreeModelで表されるデータオブジェクトを持っています。私はJTreeにその一部だけを表示したいと思います - 議論のために、葉とその親と言ってください。不要なノードを非表示にするにはどうしたらいいですか?JTreeのノードを非表示にする/フィルタリングするには?

+0

これは、この複製より古く、有益ではないスレッドです:http://stackoverflow.com/questions/9234297/filtering-on-a-jtree – bobjandal

答えて

0

まだ表示されているツリーである限り、TreeModelをフィルタリングするTreeModelは十分に単純である必要があります。

+0

これについてさらに説明できますか? –

+0

あなたは何を知りたいですか? TableModelと同じような例を見つけるのが簡単にわかります。現在のモデルに委譲するが、表示したくないノードを削除するTreeModelを作成したいとします。少なくとも、まずはすべてのイベントをstructureChangedとして伝播させることをお勧めします(ただし、ツリーの展開が崩壊する原因と考えられます)。 –

+1

問題の一部は、「表示したくないノードを削除する」と表示することもできますが、子供も削除されることです。 –

0

TreeNodeを作成し、必要な要素だけを含むTreeNodeを再構築するために使用するコードを活用します。フィルタ処理されたルートノードを使用してTreeModelのルートノードを設定します。

+0

これは可能ですが、別のモデルを設定すると、JTreeは、特に構造の変化を検出した場合、多くのことを実行します。スピードとメモリ使用量の両方に関して、パフォーマンスの点ではあまり良くありません。 – gouessej

8

私の最終的な実装:

  • は2 TreeModel秒、基礎となる1及びフィルタ1を持っています。
  • TreeModelの変更が発生した場合は、フィルタリングされたTreeModelを最初から再構築してください。表示されるはずの各ノードをクローン化し、最初に可視の祖先にフィルターしたTreeModel(または表示されていない場合はルート)に追加します。あなたが興味があるなら、下のteh codezを見てください。
  • これは、ユーザーが開いていたすべてのパスを折りたたむ不都合な副作用があります。この問題を回避するために、TreeModelListenerをフィルタリングされたTreeModelに追加しました。モデルが変更されたら、拡張パスをJTreegetExpandedDescendants()を使用)に保存してから、後で再展開します(SwingUtilities.invokeLater()を使用)。

    私が使用していたTreeNodeクラスのequals()をオーバーライドして、新しいクローンノードが古いクローンノードと同じになるようにしなければなりませんでした。


... 
    populateFilteredNode(unfilteredRoot, filteredRoot); 
    ... 

    void populateFilteredNode(TreeNode unfilteredNode, TreeNode filteredNode) 
    { 
    for (int i = 0; i < unfilteredNode.getChildCount(); i++) 
    { 
     TreeNode unfilteredChildNode = unfilteredNode.getChildAt(i); 

     if (unfilteredChildNode.getType() == Type.INVISIBLE_FOLDER) 
     { 
     populateFilteredNode(unfilteredChildNode, filteredNode); 
     } 
     else 
     { 
     TreeNode filteredChildNode = unfilteredChildNode.clone(); 

     filteredNode.add(filteredChildNode); 

     populateFilteredNode(unfilteredChildNode, filteredChildNode); 
     } 
    } 
    } 
2

あなたはJXTreeを試みたことがありますか? (残念なことに、ウェブサイトは現在ダウンしていますが、ミラーについてはGoogleを利用できます)

+0

実際、JXTreeのフィルタのサポートは計画されていたにもかかわらず、実装されたことはありません。 – gouessej

1

商用ソリューションをお探しなら、JideSoftにはフィルタリング可能なトレモデルがあります。それ以外のSwingXには、JXTable、JXTreeTable、JXTree、JXListで動作するFilter APIがあります。

+0

ありがとう!私はJideを試しましたが、私が望んだことをすることができませんでした。私はチャンスを得たときにSwingX APIを調べます。 –

+0

あなたは正確に何をしようとしていますか?あなたが詳細を提供するなら、私はいくつかの特定のコードを与えることができるかもしれません。私が理解しているところでは、検索基準からフィルタリングされた葉がその親と一緒に表示されます。 これはウェブスタートデモ、http://www.jidesoft.com/products/download.htm、「すべてのJIDE製品のデモ」に示されています。 ここで、QuickFilter(Tree)デモを見てください。 – Aakash

+0

思い出したように、目に見えない親の目に見える子どもたちを見せるために、Jideツリーモデルを手に入れることができませんでした。 –

3

あなたはGlazedListsに注意する必要があります。これは、複雑なテーブル変換を行うための小さなライブラリです。彼らはまた、木にも拡大しました。 GlazedListsの作業方法に入るためには、既存のコードを少しリファクタリングする必要があります。しかしデモやウェブキャストをチェックして、それがどれほど強力かを見てみましょう。 (これは私の見解では不可欠のSwingライブラリの一つだし、それはオープンソースです。)

+0

私はGlazedListsの木については何も見ません:https://java.net/projects/glazedlists/sources/svn/show/trunk/source/ca/odell/glazedlists/swing?rev=2375あなたが見つけた場所を教えてくださいツリーのフィルタリングAPI? – gouessej

+0

@gouessej拡張フォルダ内にあります:https://java.net/projects/glazedlists/sources/svn/show/trunk/extensions/treetable/source/ca/odell/glazedlists/swing?rev=2375 – arooaroo

+1

ありがとうございます木ではなく木のテーブルで動作します。 – gouessej

1

は、この実装を見てみましょう:http://www.java2s.com/Code/Java/Swing-Components/InvisibleNodeTreeExample.htm

それは実際に/削除するというし「のisVisible」プロパティを追加DefaultMutableNodeのサブクラスを作成し、 TreeModelからノードを追加します。

+0

私は最近、JTreeでフィルタリングを実装する必要がありました。このソリューションははるかにクリーンでシンプルです。 – Aaron

関連する問題