私はTreeModel
で表されるデータオブジェクトを持っています。私はJTree
にその一部だけを表示したいと思います - 議論のために、葉とその親と言ってください。不要なノードを非表示にするにはどうしたらいいですか?JTreeのノードを非表示にする/フィルタリングするには?
答えて
まだ表示されているツリーである限り、TreeModel
をフィルタリングするTreeModel
は十分に単純である必要があります。
これについてさらに説明できますか? –
あなたは何を知りたいですか? TableModelと同じような例を見つけるのが簡単にわかります。現在のモデルに委譲するが、表示したくないノードを削除するTreeModelを作成したいとします。少なくとも、まずはすべてのイベントをstructureChangedとして伝播させることをお勧めします(ただし、ツリーの展開が崩壊する原因と考えられます)。 –
問題の一部は、「表示したくないノードを削除する」と表示することもできますが、子供も削除されることです。 –
TreeNodeを作成し、必要な要素だけを含むTreeNodeを再構築するために使用するコードを活用します。フィルタ処理されたルートノードを使用してTreeModelのルートノードを設定します。
これは可能ですが、別のモデルを設定すると、JTreeは、特に構造の変化を検出した場合、多くのことを実行します。スピードとメモリ使用量の両方に関して、パフォーマンスの点ではあまり良くありません。 – gouessej
私の最終的な実装:
- は2
TreeModel
秒、基礎となる1及びフィルタ1を持っています。 TreeModel
の変更が発生した場合は、フィルタリングされたTreeModel
を最初から再構築してください。表示されるはずの各ノードをクローン化し、最初に可視の祖先にフィルターしたTreeModel
(または表示されていない場合はルート)に追加します。あなたが興味があるなら、下のteh codezを見てください。これは、ユーザーが開いていたすべてのパスを折りたたむ不都合な副作用があります。この問題を回避するために、
TreeModelListener
をフィルタリングされたTreeModel
に追加しました。モデルが変更されたら、拡張パスをJTree
(getExpandedDescendants()
を使用)に保存してから、後で再展開します(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);
}
}
}
商用ソリューションをお探しなら、JideSoftにはフィルタリング可能なトレモデルがあります。それ以外のSwingXには、JXTable、JXTreeTable、JXTree、JXListで動作するFilter APIがあります。
ありがとう!私はJideを試しましたが、私が望んだことをすることができませんでした。私はチャンスを得たときにSwingX APIを調べます。 –
あなたは正確に何をしようとしていますか?あなたが詳細を提供するなら、私はいくつかの特定のコードを与えることができるかもしれません。私が理解しているところでは、検索基準からフィルタリングされた葉がその親と一緒に表示されます。 これはウェブスタートデモ、http://www.jidesoft.com/products/download.htm、「すべてのJIDE製品のデモ」に示されています。 ここで、QuickFilter(Tree)デモを見てください。 – Aakash
思い出したように、目に見えない親の目に見える子どもたちを見せるために、Jideツリーモデルを手に入れることができませんでした。 –
あなたはGlazedListsに注意する必要があります。これは、複雑なテーブル変換を行うための小さなライブラリです。彼らはまた、木にも拡大しました。 GlazedListsの作業方法に入るためには、既存のコードを少しリファクタリングする必要があります。しかしデモやウェブキャストをチェックして、それがどれほど強力かを見てみましょう。 (これは私の見解では不可欠のSwingライブラリの一つだし、それはオープンソースです。)
私はGlazedListsの木については何も見ません:https://java.net/projects/glazedlists/sources/svn/show/trunk/source/ca/odell/glazedlists/swing?rev=2375あなたが見つけた場所を教えてくださいツリーのフィルタリングAPI? – gouessej
@gouessej拡張フォルダ内にあります:https://java.net/projects/glazedlists/sources/svn/show/trunk/extensions/treetable/source/ca/odell/glazedlists/swing?rev=2375 – arooaroo
ありがとうございます木ではなく木のテーブルで動作します。 – gouessej
は、この実装を見てみましょう:http://www.java2s.com/Code/Java/Swing-Components/InvisibleNodeTreeExample.htm
それは実際に/削除するというし「のisVisible」プロパティを追加DefaultMutableNodeのサブクラスを作成し、 TreeModelからノードを追加します。
私は最近、JTreeでフィルタリングを実装する必要がありました。このソリューションははるかにクリーンでシンプルです。 – Aaron
- 1. フィルタリングする前にイメージを表示/非表示にする
- 2. ノードを右クリックするとJTreeとドロップダウンオプションが表示される
- 3. フィルタリング時にマーカを表示/非表示にするフィルタ機能
- 4. JTreeのノード内にJTreeを作成する
- 5. JTreeノードにカスタムプロパティを追加する
- 6. 複合JTreeノードの下にあるオブジェクトにイベントを渡すノード
- 7. JTree - ノードを右に移動
- 8. Javafxタブペインのタブを非表示/非表示にするには
- 9. スイングでJtreeからノードにノードをドラッグ
- 10. JTreeノード名/グループ名は表示されません。
- 11. ノードタップCytoscapeの子ノードを非表示にする
- 12. ブートストラップデータテーブルの列を非表示/非表示にする方法は?
- 13. 1つのJtreeからリーフを選択し、別のJTreeに一致する結果を表示する方法
- 14. ノード赤いエディタでフローを非表示/非表示にする方法はありますか?
- 15. JTreeはリーフノードとして展開可能なノードを表示しています
- 16. ノード間のJTreeドロップインデックス
- 17. mvcSiteMapNode子ノードを非表示
- 18. C#でプロセスを非表示/非表示にする方法は?
- 19. チェックボックスを非表示または非表示にするJavaScript
- 20. JTreeにノードを動的に追加する
- 21. 手動で特定の行のJTreeにノードを挿入する
- 22. 条件を表示/非表示のフィールドを表示/非表示にする
- 23. クラスを表示/非表示にする
- 24. JavaScriptを表示/非表示にする
- 25. Jtreeの各ノードにアイコンを設定
- 26. フィルタリング中にクラスの非表示行と非表示行を除外する方法
- 27. ダイアログウィンドウからすべてのダイアログボタンを非表示/非表示にするには
- 28. JTreeノードは、2回目のマウスクリック後にその表現を変更します
- 29. ステータスバーを非表示にするには
- 30. UITableViewCellを非表示にするには?
これは、この複製より古く、有益ではないスレッドです:http://stackoverflow.com/questions/9234297/filtering-on-a-jtree – bobjandal