12

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

4

7 に答える 7

9

私の最終的な実装:

  • 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);
      }
    }
  }
于 2009-05-07T19:10:33.197 に答える
3

GlazedListsに注意する必要があります。少しの労力で複雑なテーブル変換を行うための素晴らしいライブラリです。それらは木にも拡大しました。既存のコードを GlazedLists の方法で動作させるには、少しリファクタリングが必要になる場合があります。しかし、デモと Web キャストをチェックして、その強力さを確認してください。(これは私の見解では不可欠な Swing ライブラリの 1 つであり、オープン ソースです。)

于 2009-08-14T07:55:22.777 に答える
2

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

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

于 2012-12-14T10:07:37.090 に答える
2

JXTreeを試しましたか? (残念ながら、ウェブサイトは現在ダウンしていますが、ミラーをグーグルで検索できます)

于 2009-05-07T20:02:43.650 に答える
1

商用ソリューションを探している場合、JideSoft にはフィルター可能なツリーモデルがあります。それ以外に、SwingX には、JXTable、JXTreeTable、JXTree、および JXList で動作する Filter API があります。

于 2009-05-10T18:32:42.200 に答える
0

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

于 2009-05-06T21:58:59.120 に答える
0

表示しているのがツリーである限り、TreeModel既存のフィルターはTreeModel十分に単純なはずです。

于 2009-05-06T21:21:19.430 に答える