eclipse rcp: макет собственного составного виджета - PullRequest
1 голос
/ 19 октября 2011

Я пытаюсь написать собственный виджет:

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, он будет выглядеть так:фиксированная высота, минимальная ширина, может быть изменена в горизонтальном направлении, если для этого есть больше места.

1 Ответ

0 голосов
/ 19 октября 2011

Родительский композит может дать своим дочерним элементам любой размер. С одним ребенком, FillLayout изменит размер ребенка, чтобы использовать все доступное пространство. Вот как это работает и как это должно работать.

Ответственность за компоновку своих дочерних элементов лежит на родительском композите. Другими словами, FillLayout это просто неправильный макет для использования здесь. Попробуйте это с обычным Text контролем. FillLayout сделает его намного выше, чем нужно для отдельной строки текста.

...