CheckboxTreeViewer:无法展开默认节点(CheckboxTreeViewer: Ca

2019-10-18 19:48发布

我最近实施了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);

有任何想法吗?

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

我发现这个问题的原因。 我forgott在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;
        }
    }

THX对你有所帮助!

Answer 1:

从setAutoExpandLevel的SWT的javadoc:

值为0表示没有自动展开;

1意味着看不见的根元素被扩大(因为最具体的子类不显示根元素,存在使用值0和之间usuallyno实际差别1);

2意味着顶级元素被扩展,而不是自己的孩子;

3意味着顶层元素被扩大,和他们的孩子,但不是孙子;

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

既然你发布的代码是不完整的,我想也提到,这也很重要,当你调用setAutoExpandLevel()。 在内部,当输入被改变的叫法。 所以应该setRoot之前被称为()。

下面是建立一个树像你和扩展节点示例代码:公共类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) {
    }
}

}



文章来源: CheckboxTreeViewer: Can't expand nodes by default