eclipse rcp:布局自定义复合小部件

时间:2011-10-19 04:04:15

标签: swt eclipse-rcp

我正在尝试编写自定义小部件:

package amarsoft.rcp.base.widgets;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wb.swt.ResourceManager;

public class SearchBox extends Composite {

    private Text text;

    private Label icon;

    public SearchBox(Composite parent) {
        super(parent, SWT.BORDER);
        setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
        setBackgroundMode(SWT.INHERIT_FORCE);

        icon = new Label(this, SWT.NONE);
        icon.setImage(ResourceManager.getImage("icons/search.png"));

        text = new Text(this, SWT.NONE);
        addControlListener(new ControlAdapter() {
            @Override
            public void controlResized(ControlEvent e) {
                resize();
            }

        });
    }

    void resize() {
        Point iExtent = icon.computeSize(SWT.DEFAULT, SWT.DEFAULT, false);
        Point tExtent = text.computeSize(SWT.DEFAULT, SWT.DEFAULT, false);
        icon.setBounds(tExtent.x, 1, iExtent.x, iExtent.y);
        text.setBounds(1, 1, tExtent.x, tExtent.y);
    }

    @Override
    public Point computeSize(int wHint, int hHint, boolean changed) {
        Point iExtent = icon.computeSize(SWT.DEFAULT, SWT.DEFAULT, false);
        Point tExtent = text.computeSize(SWT.DEFAULT, SWT.DEFAULT, false);
        System.out.println(iExtent);
        System.out.println(tExtent);
        int width = iExtent.x + tExtent.x;
        int height = Math.max(iExtent.y, tExtent.y);
        if (wHint != SWT.DEFAULT)
            width = wHint;
        if (hHint != SWT.DEFAULT)
            height = hHint;
        System.out.println(new Point(width + 2, height + 2));
        return new Point(width + 5, height + 5);
    }

}

如果我尝试在具有RowLayout的父组合中使用它,它看起来像这样:
enter image description here

但是如果我尝试在具有FillLayout的父组合中使用它,它看起来像: enter image description here

我怎样才能让它始终像这样: 如果有更多的空间,它总是有一个固定的高度,一个最小的宽度,可以在水平方向上调整大小。

1 个答案:

答案 0 :(得分:0)

父组合可以为其子组件提供所需的任何大小。对于单个孩子,FillLayout将调整孩子的大小以消耗所有可用空间。这就是它的工作原理以及它应该如何工作。

父组合的责任是以合适的方式布置其子组件。换句话说,FillLayout只是在这里使用的错误布局。使用常规Text控件进行尝试。 FillLayout将使其高于单行文本所需的值。