1

私は最近CheckboxTreeViewer、自分でa を実装しました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 は、最上位の要素とその子は展開されますが、孫は展開されないことを意味します。

したがって、自動拡張レベルを 2 ではなく 3 に設定する必要があります。

ご投稿いただいたコードは未完成ですので、setAutoExpandLevel()を呼び出す際にも重要であることを記しておきます。内部的には、入力が変更されたときに呼び出されます。そのため、setRoot() の前に呼び出す必要があります。

以下は、あなたのようなツリーを構築し、ノードを展開するサンプル コードです。

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 に答える