이 단순한 기능에 대한 문서가 부족하여 혼란 스럽습니다. 나는 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) (이 같은 문제의 경우 잘 모르겠어요,하지만 솔루션 중 하나 방법이 없습니다)
'expandToLevel'의 경우 트리를 통해 요소가 아니라 요소까지의 전체 경로와 함께'TreePath'를 사용하십시오. –
@ greg-449하지만 경로는 어떻게 얻을 수 있습니까? 이 예제는'getParent (Object)'메소드를 가지고 있지만,이 메소드가 없다는 것은 완전히 유효하다. –
TreePath와 함께 expandToLevel을 사용하려면 경로를 어떻게 든 작동시킬 수 있어야합니다. expandToLevel의 문제점은 트리의 분기가 결코 확장되지 않은 경우 뷰어에 해당 분기에있는 정보가 없으므로 단일 요소를 지정하면 작동하지 않는다는 것입니다. –