CheckboxTreeViewer: не удается расширить узлы по умолчанию

Недавно я реализовал 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;
        }
    }

Спасибо за вашу помощь!


person ph09    schedule 22.10.2013    source источник
comment
Не уверен, в чем проблема. Выполнение этого кода работает нормально. Может быть, вы можете сравнить свой код со связанным кодом.   -  person Baz    schedule 22.10.2013
comment
Спасибо за ссылку, но принципиальных отличий не нашел. Как вы запускали код? Я использую Eclipse Kepler и запускаю CheckboxTreeViewer внутри EMF/GMF. Но это не должно вызывать такое поведение...   -  person ph09    schedule 22.10.2013


Ответы (1)


Из javadoc SWT setAutoExpandLevel:

Значение 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) {
    }
}

}

person andi    schedule 22.10.2013