1

1つのcomposite0内に3つのcomposite(1,2,3)を配置したので、それらはすべて、に基づいてレイアウトを設定します composite0.setLayout(new FormLayout())。私が今抱えている問題は、composite3を非表示にすることです:(composite3.setVisible(false);データを削除したくない、それでもそのコンポーネントは必要ですが、UIに表示したくないだけです)、そしてcomponite2の後に大きなギャップがあります。大きなギャップ(composite2を配置するために使用)を削除するにはどうすればよいですか?よろしくお願いします!

4

3 に答える 3

1

公式のSWTの例のSnippet313は、それを支援するはずです。基本的にFormData、composite3を表示するか非表示にするかに応じて、異なる設定を行います。

于 2012-07-06T07:27:20.750 に答える
1

そのためにデータバインディングを監視できますが、コントロールがGridLayout内にあることを前提としています。チェックボックスの選択状態に応じて、ウィザードページ内でコンポジットとウィジェットを表示および非表示にするために使用します。

使用するには、次のように設定します。

DataBindingContext dbc = new DataBindingContext();
Button button = new Button(composite, SWT.CHECK);
IObservableValue target = SWTObservables.observeSelection(button);
dbc.bindValue(target, new HideControlObservable(someControl));

観察可能なものは次のとおりです。

/**
 * Observable to control the presence (visibility and size) of any control
 * within a grid layout.
 * <p>
 * Changing the value of this observable will do two things:
 * <ol>
 * <li>Set the visibility of the control</li>
 * <li>Set the size of the control to zero when the control is invisible.</li>
 * </ol>
 * So, when using this observable, the control will not only be invisible,
 * but it will be gone, completely. Normally, when setting the visibility of
 * a control to <code>false</code>, the control will not be displayed but
 * will still take all the space on the screen.
 * </p>
 * <p>
 * <strong>Note:</strong> this observable works for controls within a
 * <strong>GridLayout only</strong>.
 * </p>
 */
public class HideControlObservable extends WritableValue implements IValueChangeListener {
    private final DataBindingContext dbc = new DataBindingContext();
    private final ISWTObservableValue sizeObservable;
    private final Point size = new Point(0, 0);
    private final Control control;

    public HideControlObservable(Control control) {
        super(control.getVisible(), Boolean.class);
        this.control = control;

        UpdateValueStrategy never = new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER);
        dbc.bindValue(SWTObservables.observeVisible(control), this, never, null);

        sizeObservable = SWTObservables.observeSize(control);
        sizeObservable.addValueChangeListener(this);

        if (!control.isVisible()) {
            GridData gd = (GridData) control.getLayoutData();
            if (gd == null) {
                gd = new GridData();
            }
            gd.exclude = true;
            control.setLayoutData(gd);
            control.setSize(new Point(0, 0));
        }
    }

    @Override
    public void doSetValue(Object value) {
        super.doSetValue(value);
        Boolean bool = (Boolean) value;
        if (bool) {
            GridData gd = (GridData) control.getLayoutData();
            if (gd == null) {
                gd = new GridData();
            }
            gd.exclude = false;
            control.setLayoutData(gd);
            control.setSize(size);
            control.getParent().layout();
        } else {
            GridData gd = (GridData) control.getLayoutData();
            if (gd == null) {
                gd = new GridData();
            }
            gd.exclude = true;
            control.setLayoutData(gd);
            control.setSize(new Point(0, 0));
            control.getParent().layout();
        }
    }

    @Override
    public synchronized void dispose() {
        sizeObservable.dispose();
        super.dispose();
    }

    @Override
    public void handleValueChange(ValueChangeEvent event) {
        Point newSize = (Point) event.getObservableValue().getValue();
        if (newSize.x > size.x) {
            size.x = newSize.x;
        }
        if (newSize.y > size.y) {
            size.y = newSize.y;
        }
    }
}
于 2013-01-31T14:37:51.450 に答える
-3
        FormData data = new FormData();
        data.left = new FormAttachment(0, 100, EditorPanel.SPACING);
        data.top = new FormAttachment(section1, EditorPanel.SPACING);
        data.height = 0;
        data.width = 0;
        addSectionFormData(a, b, c);
        a.setLayoutData(data);
        b.setLayoutData(data);

これで問題は解決します!:)

于 2012-07-09T21:24:27.227 に答える