CheckboxTreeViewer:默认情况下无法展开节点 [英] CheckboxTreeViewer: Can't expand nodes by default

查看:340
本文介绍了CheckboxTreeViewer:默认情况下无法展开节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近在我自己的对话框中实现了 CheckboxTreeViewer 。这工作正常,除了树不允许我扩展节点默认情况下。它只有当我选中复选框,如下图所示:



这是默认情况下。正如你所看到的,它不可能扩展节点,虽然它有孩子:

检查复选框后,它的工作原理:





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

 复合容器=(Composite)super.createDialogArea 
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 ){
ProductLine productLine =(ProductLine)element;
if(productLine.getPropertyList()!= null){
return true;
} else {
return false;
}
}
if(PropertyList的元素实例){
PropertyList propertyList =(PropertyList)element;
if(!(propertyList.getGeneralPlatforms()。isEmpty())){
return true;
} else {
return false;
}
} else if(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您的帮助!!

解决方案

从setAutoExpandLevel的SWT javadoc:


值0意味着没有自动展开;



1意味着不可见根元素被展开(因为大多数
具体子类不显示根元素,通常没有
使用值0和1之间的实际差异);



2意味着顶级元素被展开,但不是他们的孩子; / p>

3表示顶层元素及其子元素已展开,但
不是孙子元素;


因此,您应该将自动展开级别设置为3,而不是2。



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



下面是一个示例代码,它构建一个类似yours的树并扩展节点:$ b​​ $ b 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(newPropertyPropertyDialogContentProvider());
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){
caseroot
return new String [] {Platform XYZ12,Platform ZUPP};
casePlatform XYZ12:
return new String [] {Microcontroller TPU23};
casePlatform ZUPP:
return new Object [] {Sensor,Precaler IO};
caseSensor:
return new Object [] {unknown child 1,unknown child 3};
默认值:
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 ,Object oldInput,Object newInput){
}
}

p>

I recently implemented a CheckboxTreeViewer in my own Dialog. This works fine so far except that the tree doesn't allow me to expand nodes by default. It only works when I check the checkbox, as you can see in the following images:

This is by default. As you can see, it's not possible to expand the node, though it has children:

After checking the check box, it works:

I already tried to use setExpandPreCheckFilters , but with no success:

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

Any ideas?

-----------------------------------Update-------------------------------------

I found the reason of the problem. I forgott to check every element in the hasChildren method. The following code is working now for me:

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 for your help!!

解决方案

From the SWT javadoc of setAutoExpandLevel:

The value 0 means that there is no auto-expand;

1 means that the invisible root element is expanded (since most concrete subclasses do not show the root element, there is usuallyno practical difference between using the values 0 and 1);

2 means that top-level elements are expanded, but not their children;

3 means that top-level elements are expanded, and their children, but not grandchildren;

So you should set auto expand level to 3, not 2.

Since the code you posted is not complete, I would like to also mention that it is important also when you call setAutoExpandLevel(). Internally it is called when input is changed. So it should be called before setRoot().

Below is a sample code that builds a tree like yours and expands the nodes: 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) {
    }
}

}

这篇关于CheckboxTreeViewer:默认情况下无法展开节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆