首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在TreeViewer中选择节点

在TreeViewer中选择节点
EN

Stack Overflow用户
提问于 2017-01-26 06:57:03
回答 1查看 1.9K关注 0票数 1

对于这个非常简单的特性,缺乏文档是令人不安的。我有一个TreeViewer,希望选择一个节点。唯一有意义的方法是,如果树将所有元素扩展到所选内容,否则用户就无法看到它。

代码语言:javascript
复制
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();
        }

    }
}

我试过的是:

代码语言:javascript
复制
treeViewer.setSelection(new StructuredSelection(fileToExpand));
System.out.println("Selection: " + treeViewer.getSelection());

选择没有设定。(我多次看到使用了TreeViewer#setSelection(ISelection, boolean),但JavaDoc声明“目前未遵守select参数,因为Tree没有提供仅选择一个项目而不将其滚动到视图中的API”)。

代码语言:javascript
复制
treeViewer.expandToLevel(fileToExpand, AbstractTreeViewer.ALL_LEVELS);

这种方法..。什么都不做?

代码语言:javascript
复制
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();
    }
}

可能有用吗?但选择没有设定所以..。

代码语言:javascript
复制
treeViewer.expandAll();

这个方法通常有效,但是我不认为在上面的例子中尝试它是一个好主意。它不做我想做的事,所以无论如何都是没有意义的。

问题似乎是TreeItem是懒散地创建的。若要检查是否可以尝试此操作,请执行以下操作:

代码语言:javascript
复制
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) (我不确定这是否是同一个问题,但两者都没有解决办法)

EN

回答 1

Stack Overflow用户

发布于 2018-03-03 18:42:27

我能够在JFace 3.13.2上使用它:

代码语言:javascript
复制
// 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));

上述代码将使所有节点向下扩展到所选元素的级别,将树的相关部分滚动到视图中,并将元素标记为选定的元素。

在我的例子中,树是四层深的,所选的元素是一个叶节点。如果希望展开所选节点以下的级别,可以向expandToLevelTreeViewer.ALL_LEVELS提供高于0的级别作为第二个参数,以展开子树中的所有级别。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41868226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档