1

我最近CheckboxTreeViewer在自己的Dialog. 到目前为止,这工作正常,除了树默认情况下不允许我扩展节点。它仅在我选中复选框时才有效,如下图所示:

这是默认设置。如您所见,虽然它有子节点,但无法展开节点:

选中复选框后,它可以工作:

在此处输入图像描述

我已经尝试过使用setExpandPreCheckFilters,但没有成功:

Composite container = (Composite) super.createDialogArea(parent);
tv = new CheckboxTreeViewer(container, SWT.MULTI | SWT.H_SCROLL| SWT.V_SCROLL);
GridData gridData = new GridData(GridData.FILL_BOTH);
tv.getTree().setLayoutData(gridData);
tv.setContentProvider(new FeaturePropertyDialogContentProvider());
tv.setLabelProvider(new FeaturePropertyDialogLabelProvider());
tv.setAutoExpandLevel(2);
tv.setExpandPreCheckFilters(true);

有任何想法吗?

- - - - - - - - - - - - - - - - - -更新 - - - - - - - ----------------------

我找到了问题的原因。我忘了检查hasChildren方法中的每个元素。以下代码现在为我工作:

public boolean hasChildren(Object element) {
        if (element instanceof ProductLine) {
            ProductLine productLine = (ProductLine) element;
            if (productLine.getPropertyList() != null) {
                return true;
            } else {
                return false;
            }
        }
        if (element instanceof PropertyList) {
            PropertyList propertyList = (PropertyList) element;
            if (!(propertyList.getGeneralPlatforms().isEmpty())) {
                return true;
            } else {
                return false;
            }
        } else if (element instanceof GeneralPlatform) {
            GeneralPlatform platform = (GeneralPlatform) element;
            if (!(platform.getHardwareElements().isEmpty())) {
                return true;
            } else {
                return false;
            }
        } else if (element instanceof HardwareElement) {
            HardwareElement hw = (HardwareElement) element;
            if (!(hw.getHardwareElements().isEmpty())
                    || !(hw.getProperties().isEmpty())) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

谢谢你的帮助!!

4

1 回答 1

2

来自 setAutoExpandLevel 的 SWT javadoc:

值 0 表示没有自动展开;

1 表示扩展不可见的根元素(由于大多数具体子类不显示根元素,因此使用值 0 和 1 通常没有实际区别);

2 表示扩展顶级元素,但不扩展其子元素;

3 表示扩展顶级元素,以及它们的子元素,而不是孙子元素;

所以你应该将自动扩展级别设置为 3,而不是 2。

由于您发布的代码不完整,我还想提一下,当您调用 setAutoExpandLevel() 时它也很重要。当输入改变时在内部调用它。所以它应该在 setRoot() 之前调用。

下面是一个示例代码,它构建一个像你一样的树并扩展节点: public class CheckTreeSnippet {

public static void main(String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());

    CheckboxTreeViewer tv = new CheckboxTreeViewer(shell, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
    GridData gridData = new GridData(GridData.FILL_BOTH);
    tv.getTree().setLayoutData(gridData);
    tv.setAutoExpandLevel(3);
    tv.setContentProvider(new FeaturePropertyDialogContentProvider());
    tv.setInput("root");

    shell.setSize(200, 200);
    shell.open();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
    display.dispose();
}

private static class FeaturePropertyDialogContentProvider implements ITreeContentProvider {

    @Override
    public Object[] getElements(Object inputElement) {
        return this.getChildren(inputElement);
    }

    @Override
    public Object[] getChildren(Object parentElement) {
        switch ((String) parentElement) {
            case "root":
                return new String[]{"Platform XYZ12", "Platform ZUPP"};
            case "Platform XYZ12":
                return new String[]{"Microcontroller TPU23"};
            case "Platform ZUPP":
                return new Object[]{"Sensor", "Precaler IO"};
            case "Sensor":
                return new Object[]{"unknown child 1", "unknown child 3"};
            default:
                return new String[0];
        }
    }

    @Override
    public Object getParent(Object element) {
        return null;
    }

    @Override
    public boolean hasChildren(Object element) {
        return this.getChildren(element).length > 0;
    }

    @Override
    public void dispose() {
    }

    @Override
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
    }
}

}

于 2013-10-22T16:06:44.237 回答