2017-01-26 4 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은 "Tree가보기에 스크롤하지 않고 항목 만 선택할 수있는 API를 제공하지 않기 때문에 현재 reveal 매개 변수가 적용되지 않습니다"라고 설명합니다).

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()); 
} 

이 방법 출력 중 하나 일 경우. 또한 어린이 데이터를 가져 오려면 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 레벨 깊이 였고 선택한 요소는 리프 노드였습니다. 선택한 노드 아래로 레벨을 확장하려면 두 번째 매개 변수로 0보다 높은 레벨을 expandToLevel 또는 TreeViewer.ALL_LEVELS으로 지정하여 하위 트리의 모든 레벨을 확장 할 수 있습니다.

+0

공유 해 주셔서 감사합니다. 그러나 사용 사례의 모든 노드를 확장 할 수 없습니다 : ( –

+0

@SteffiS., 선택한 노드를 표시하려면 어떻게해야합니까? 상위 노드를 확장하지 않으면 어떻게됩니까? 부모 노드가 확장되지 않으면 노드가 표시되지 않습니다 ... –