2

多くのノードを表示する FilteredTree があり、各ノードには複数の子とサブ子 (n 深度) を含めることができます。

フィルターは、パターンに一致するすべてのノード (および任意の深さの子) をフィルター処理します。

ここで、別の検索機能を追加したいと思います。

すべてのノードはオブジェクトを表し、各オブジェクトにはいくつかのフィールドがあるため、テキストに一致するフィールドを持つノードをリストしたいと思います。

ViewerFilter を使うのに疲れました。

現在開いているブランチに対してのみ、ツリー内のすべてのノードに対して呼び出されるわけではないという問題があります。

public class TheFilter extends ViewerFilter {

          private String searchString;

          public void setSearchText(String s) {

          }


          public boolean select(Viewer viewer, 
              Object parentElement, 
              Object element) { //triggered Only for one level


            return true;
          }
        } 

アップデート:

検索された項目が見つかったら、検索された項目を含むノードだけでなく、その親 (すべての親) も表示したいと考えています。

4

2 に答える 2

1

私が理解しているように、現在展開されているかどうかに関係なく、すべての要素に検索を適用する必要があります。なぜ最も深い葉にもフィルタリングを適用する必要があるのか​​わかりませんが、子を表示しないルートノードも非表示にする必要があるためですか?

ここではいくつかの方法があります。フィルターをすべての要素に強制的に適用する場合は、を使用してツリー内のすべてのアイテムを展開できますTreeViewer#expandAll。ただし、レイジーコンテンツプロバイダーを使用している場合を除き、すべての要素でフィルターを呼び出す必要があります。展開したままにしたくない場合は、ツリーを再度折りたたむことができます(ちらつきを避けるために、展開および折りたたみ中に描画を無効にすることができますTree#setRedraw(boolean))。通常、ツリーでは、何かが検索されているときに、フィルタリングされたすべてのコンテンツが展開されて表示されるため、検索条件にも一致する最も深い葉も表示されます。ユーザーが行ったように各要素のツリーの拡張状態を維持したい場合は、すべてを拡張してから拡張を復元するためにもう少し作業が必要になります。

もう1つのアプローチは、コンテンツプロバイダー内で検索を実装することです。したがって、コンテンツプロバイダーは現在の検索基準を取得し、それに一致する要素のみを返すことができます。これは、特定の親が表示されるかどうかを自分で管理する必要があることを意味します。したがって、検索フィールドを変更する場合は、ツリーを更新するだけで、コンテンツプロバイダーがフィルタリングを保証します。

于 2012-11-14T15:33:50.887 に答える
1

FilteredTreeorg.eclipse.ui.dialogs.PatternFilterフィルタ戦略を決定するために as 引数を受け入れます。

PatternFilter をサブクラス化し、そのisLeafMatchメソッドをオーバーライドすることで、目的の結果を得ることができます。

例えば:

PatternFilter filter = new PatternFilter() {
    @Override
    protected boolean isLeafMatch(Viewer viewer, Object element) {
        String field = ((Node) element).getField();
        if(field== null) {
            return false;
        }
        return wordMatches(field);
    }
};
FilteredTree tree = new FilteredTree(parent, SWT.MULTI | SWT.H_SCROLL
            | SWT.V_SCROLL, filter, true);
于 2012-11-11T23:44:40.707 に答える