2017-01-26 8 views
0

この単純な機能のためのドキュメントが不足しているのは混乱しています。私はTreeViewerを持っていて、ノードを選択したい。これが意味する唯一の方法は、ツリーがすべての要素を選択肢に展開し、そうでなければユーザーがそれを見ることができない場合です。TreeViewerでノードを選択

私が試した何
public class TreeWindow extends ApplicationWindow { 

    public static void main(String[] args) { 
     new TreeWindow().open(); 
    } 

    public TreeWindow() { 
     super(null); 
     setBlockOnOpen(true); 
    } 

    @Override 
    protected Control createContents(Composite parent) { 
     final TreeViewer treeViewer = new TreeViewer(parent); 
     treeViewer.setContentProvider(new FileTreeContentProvider()); 
     treeViewer.setLabelProvider(new LabelProvider() { 
      @Override 
      public String getText(Object element) { 
       String result = ((File) element).getName(); 
       if (result.isEmpty()) { 
        result = ((File) element).getPath(); // root like C:\ 
       } 
       return result; 
      } 
     }); 
     treeViewer.setInput(File.listRoots()); 

     // expand 
     final File fileToExpand = new File("src"); 
     System.out.println("Expand to file: " + fileToExpand.getAbsolutePath()); 
     return treeViewer.getControl(); 
    } 

    static class FileTreeContentProvider extends ArrayContentProvider implements ITreeContentProvider { 

     @Override 
     public Object[] getChildren(Object parentElement) { 
      return ((File) parentElement).listFiles(); 
     } 

     @Override 
     public Object getParent(Object element) { 
      return ((File) element).getParentFile(); 
     } 

     @Override 
     public boolean hasChildren(Object element) { 
      return ((File) element).isDirectory(); 
     } 

    } 
} 

treeViewer.setSelection(new StructuredSelection(fileToExpand)); 
System.out.println("Selection: " + treeViewer.getSelection()); 

選択が設定されません。 (私は複数回、TreeViewer#setSelection(ISelection, boolean)が使用されているのを見ましたが、JavaDocは "現在表示されていないアイテムを選択するだけのAPIをツリーに提供しないため、公開パラメータは受け付けられません"と述べています)。

treeViewer.expandToLevel(fileToExpand, AbstractTreeViewer.ALL_LEVELS); 

この方法は何もしませんか?

final Tree tree = treeViewer.getTree(); 
final TreeItem[] items = tree.getSelection(); 
for (int i = 0; i < items.length; ++i) { 
    final TreeItem item = items[i]; 
    TreeItem treeParent = item.getParentItem(); 
    while (treeParent != null) { 
     treeParent.setExpanded(true); 
     treeParent = treeParent.getParentItem(); 
    } 
} 

おそらく多分でしょうか?しかし、選択は

treeViewer.expandAll(); 

このメソッドは、正常に動作...ので、設定されませんが、私はそれが上記の例では、それを試すには良いアイデアだとは思いません。それは、私が欲しいものをやっていないので、とにかく議論のポイントです。

問題は、TreeItemが遅れて作成されているようです。あなたはこれを試すことができていることを確認するには、次の項目が子を持つか、0でない場合は、しかしない実際のアイテム数

for (final TreeItem item : this.treeViewer.getTree().getItems()) { 
    System.out.println(item.getData() + " " + item.getItemCount()); 
} 

このメソッドの出力のいずれか1場合。また、子供のデータを取得しようとすると、それはnullです。

拡張されていないノードを選択するにはどうすればよいですか?ツリーを選択範囲/指定したノードに展開するにはどうすればよいですか?

可能な重複: How to expand a specific node in TreeViewer(org.eclipse.jface)(私はこれは同じ問題であるかどうかわからないんだけど、何の解決策のいずれかの方法はありません)

+0

'expandToLevel'の場合、ツリーを通り、要素だけでなく要素に至るまでの完全なパスを持つ' TreePath'を使ってみてください。 –

+0

@ greg-449しかし、私はどのように道を得るだろうか?この例は 'getParent(Object)'メソッドを持っていますが、このメソッドを持たないように完全に有効です。 –

+0

TreePathでexpandToLevelを使用する場合は、何らかの形でパスを作成する必要があります。 expandToLevelの問題は、ツリーのブランチが一度も展開されていない場合、そのブランチに何が含まれているかについての情報がないため、単一の要素を指定するだけでは機能しないということです。 –

答えて

0

私は、これはJFaceの3.13.2で動作するように取得することができた。

// element is any object of your tree content provider data model, 
// in your case a File. 
treeViewer.expandToLevel(element, 0); 
treeViewer.setSelection(new StructuredSelection(element)); 

上記のコードは、選択した要素のレベルまですべてのノードを展開し、ツリーの関連する部分をスクロールして選択した要素としてマークします。

私の場合、ツリーは4レベル深く、選択された要素は葉ノードでした。選択したノードの下にレベルを展開する場合は、2番目のパラメータとして0より高いレベルをexpandToLevelに、またはTreeViewer.ALL_LEVELSに指定して、サブツリー内のすべてのレベルを展開することができます。

+0

共有してくれてありがとうございますが、ユースケースのすべてのノードを展開することはできません:( –

+0

@SteffiS。、選択したノードを上にすべて展開しないとどうなりますか?親ノードが展開されていない限りノードは表示されません... –

関連する問題