我正在尝试编写自定义小部件:
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的父组合中使用它,它看起来像这样:
但是如果我尝试在具有FillLayout的父组合中使用它,它看起来像:
我怎样才能让它始终像这样: 如果有更多的空间,它总是有一个固定的高度,一个最小的宽度,可以在水平方向上调整大小。
答案 0 :(得分:0)
父组合可以为其子组件提供所需的任何大小。对于单个孩子,FillLayout
将调整孩子的大小以消耗所有可用空间。这就是它的工作原理以及它应该如何工作。
父组合的责任是以合适的方式布置其子组件。换句话说,FillLayout
只是在这里使用的错误布局。使用常规Text
控件进行尝试。 FillLayout
将使其高于单行文本所需的值。