で表されたデータ オブジェクトがあり、TreeModel
その一部だけを表示したいと思いJTree
ます -- 議論のために、葉とその親を言います。不要なノードを非表示/フィルタリングするにはどうすればよいですか?
7 に答える
私の最終的な実装:
TreeModel
基になるものとフィルター処理されたものの 2 つの があります。- 基になる で変更が発生した場合は
TreeModel
、フィルター処理さTreeModel
れた を最初から再構築します。表示する必要がある各ノードを複製し、フィルター処理された最初の表示可能な祖先TreeModel
(表示されない場合はルート) に追加します。興味がある場合は、以下のコードを参照してください。 これには、ユーザーが開いていたすべてのパスが折りたたまれるという不幸な副作用があります。これを回避するため
TreeModelListener
に、filtered にa を追加しましたTreeModel
。モデルが変更されたら、展開したパスを に保存しJTree
( を使用getExpandedDescendants()
)、後で再展開します ( を使用SwingUtilities.invokeLater()
)。新しいクローン ノードが古いクローン ノードと同じになるように、使用してい
equals()
たクラスをオーバーライドする必要がありました。TreeNode
...
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);
}
}
}
GlazedListsに注意する必要があります。少しの労力で複雑なテーブル変換を行うための素晴らしいライブラリです。それらは木にも拡大しました。既存のコードを GlazedLists の方法で動作させるには、少しリファクタリングが必要になる場合があります。しかし、デモと Web キャストをチェックして、その強力さを確認してください。(これは私の見解では不可欠な Swing ライブラリの 1 つであり、オープン ソースです。)
この実装を見てみましょう: http://www.java2s.com/Code/Java/Swing-Components/InvisibleNodeTreeExample.htm
TreeModel からノードを実際に削除/追加するのではなく、「isVisible」プロパティを追加する DefaultMutableNode のサブクラスを作成します。
JXTreeを試しましたか? (残念ながら、ウェブサイトは現在ダウンしていますが、ミラーをグーグルで検索できます)
商用ソリューションを探している場合、JideSoft にはフィルター可能なツリーモデルがあります。それ以外に、SwingX には、JXTable、JXTreeTable、JXTree、および JXList で動作する Filter API があります。
TreeNode を構築するために使用するコードを活用し、必要な要素のみを含む TreeNode を再構築します。フィルター処理されたルート ノードを使用して、TreeModel にルート ノードを設定します。
表示しているのがツリーである限り、TreeModel
既存のフィルターはTreeModel
十分に単純なはずです。