java - Eclipse RCP - ILazyTreeContentProvider 实现出乎意料地急切

标签 java eclipse-plugin swt eclipse-rcp jface

我正在开发 Eclipse RCP 应用程序,并尝试使用 ILazyTreeContentProvider 实现以便在特定时间仅显示可见项目。

代码:

在扩展 ViewPart 的类中:

public void createPartControl(Composite parent) {
        viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.VIRTUAL);
        drillDownAdapter = new DrillDownAdapter(viewer);
        viewer.setContentProvider(new ViewContentProvider());
        viewer.setLabelProvider(new ViewLabelProvider());
        //viewer.setSorter(new NameSorter());
        viewer.setInput(getViewSite());

        // Create the help context id for the viewer's control
        PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "test.provider.lazy.viewer");
        makeActions();
        hookContextMenu();
        hookDoubleClickAction();
        contributeToActionBars();
    }

在 ContentProvider 内部:

@Override
        public void updateElement(Object parent, int index) {
            System.out.println(updateElementCounter++);
            if (parent.equals(getViewSite())) {
                if (index == 0) {
                    TreeParent child = new TreeParent("Parent 1");
                    viewer.replace(parent, index, child);
                    viewer.setHasChildren(child, true);
                } else {
                    TreeParent child = new TreeParent("Parent 2");
                    viewer.replace(parent, index, child);
                    viewer.setHasChildren(child, true);
                    //viewer.setChildCount(child, 1);
                }
            } else {
                if (parent instanceof TreeParent) {
                    TreeParent treeParent = (TreeParent) parent;
                    if (treeParent.getName().equals("Parent 1")) {
                    TreeObject child = new TreeObject("Leaf "+index);
                    viewer.replace(treeParent, index, child);
                    viewer.setHasChildren(child, false);
                    //viewer.setChildCount(child, 0);
                    } else {
                        TreeObject child = new TreeObject("Special One");
                        viewer.replace(treeParent, index, child);
                        viewer.setHasChildren(child, false);
                        //viewer.setChildCount(child,0);
                    }

                }
            }
        }
        @Override
        public void updateChildCount(Object element, int currentChildCount) {
            if (element.equals(getViewSite())) {
                viewer.setChildCount(getViewSite(), 2);
            } else 
            if (element instanceof TreeParent) {
                TreeParent parent = (TreeParent) element;
                if (parent.getName().equals("Root")) {
                    viewer.setChildCount(parent, 2);
                } else if (parent.getName().equals("Parent 1")) {
                    viewer.setChildCount(parent, 20);
                } else {
                    viewer.setChildCount(parent, 1);
                }
            } else {
                viewer.setChildCount(element, 0);
            }

        }

问题是每次我展开 TreeItem 的子项时,它都会加载所有子元素,而不仅仅是可见的子元素,而 System.out.println(updateElementCounter++); 命令会打印出来所有 22 个,尽管只有 7 个树项目可见。

enter image description here

ILazyTreeContentProvider 不应该只加载可见的吗? (在本例中为 7 项)

我一定是做错了什么......

无论如何,非常感谢任何意见!

最佳答案

我已将我的示例与 this one 进行了比较 而且我发现只有一个不同之处造成了所有的不同:

v.setUseHashlookup(true); //v is the TreeViewer

该方法在其文档中的说明:

Configures whether this structured viewer uses an internal hash table to speeds up the mapping between elements and SWT items. This must be called before the viewer is given an input (via setInput).

现在的内容提供者其实是懒惰的。只绘制可见的项目,而不是所有项目。

关于java - Eclipse RCP - ILazyTreeContentProvider 实现出乎意料地急切,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19092744/

相关文章:

java - Java中如何判断类成员是否是静态成员和字段

Java 6 JVM 挂起

java - 匹配开头和结尾的正则表达式

eclipse - 你如何找到菜单贡献的locationURI?

java - 使用 Eclipse Neon 进行 Coffee-Bytes 代码折叠

java - JFace PopupDialog 中小部件的背景颜色

java - 从文本文件读取时多线程进度栏不更新

eclipse - 构建工作区时出现 TeXlipse 错误

带有键盘快捷键的 SWT 操作...无需将它们添加到菜单中

java - swt.graphics.ImageLoader.save() 未刷新?