java - 在 TreeViewer 中选择节点

标签 java swt jface

缺乏这个非常简单的功能的文档令人不安。我有一个 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 指出“目前不支持 Reveal 参数,因为 Tree 不提供仅选择项目而不滚动的 API它进入 View ”)。

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

上面的代码将使所有节点向下展开到所选元素的级别,将树的相关部分滚动到 View 中并将该元素标记为选中。

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

关于java - 在 TreeViewer 中选择节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41868226/

相关文章:

java - Patterns.WEB_URL.matcher(str) 的错误行为

java - SWT Eclipse 组合事件

java - SWT 文本的适当监听器

java - 用于日期的 Eclipse JFace FieldEditor?

java - 如何更改 swt 表中的单元格间距

java - 如何减小 RCP 中表查看器中的表大小?

java - 提高数据库访问性能

java - 如何使jsp spring应用线程安全?

java - 在 Swing 中模拟这个 SWT Shell

java - 如何更改谷歌应用程序联系人API中的图片?