这个非常简单的功能缺乏文档是令人不安的。我有一个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来仅选择项目而不将其滚动到视图中”)。
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
是懒惰创造的。要检查您是否可以尝试:
for (final TreeItem item : this.treeViewer.getTree().getItems()) {
System.out.println(item.getData() + " " + item.getItemCount());
}
如果项目具有子项,则此方法输出1或如果不是则输出0,但不输出实际项目计数。此外,如果您尝试获取孩子的数据,那就是null
。
如何选择未展开的节点?如何将树展开到选择/指定节点?
可能重复:How to expand a specific node in TreeViewer(org.eclipse.jface)(我不确定这是否是同样的问题,但无论如何都没有解决方案)
我能够在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));
上面的代码将使所有节点向下扩展到所选元素的级别,将树的相关部分滚动到视图中并将元素标记为选中。
在我的例子中,树是四层深,所选元素是叶节点。如果要扩展所选节点以下的级别,可以提供高于0的级别作为expandToLevel
的第二个参数,或者TreeViewer.ALL_LEVELS
以扩展子树中的所有级别。