除了收听调整大小之外,您还可以使用具有更多列数的 GridLayout,通过让内容跨越多个列,您可以根据需要分配空间。
例如,对于 70:30 分布,创建 10 列网格布局。让第一个孩子跨越 7 列,第二个孩子跨越 3 列。
根据您的用例,使用 GridLayout 的一个缺点可能是,如果他们想要更大,它不会强制子级缩小到父级大小(我经常遇到可能只是换行的长标签的问题)。
避免这个问题的一个选择是实现一个支持百分比的简单布局管理器:
public class ColumnLayout extends Layout {
int[] percentages;
public ColumnLayout(int... percentages) {
this.percentages = percentages;
}
@Override
protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {
Control[] children = composite.getChildren();
int height = hHint;
int width = wHint;
int consumedPercent = 0;
for (int i = 0; i < children.length; i++) {
int percent;
if (i >= percentages.length) {
percent = (100 - consumedPercent) / (children.length - percentages.length);
} else {
percent = percentages[i];
consumedPercent += percent;
}
Point childSize = children[i].computeSize(wHint == -1 ? -1 : wHint * percent / 100, hHint);
if (wHint == -1) {
width = Math.max(width, childSize.x * (100 - percent) / 100);
}
if (hHint == -1) {
height = Math.max(height, childSize.y);
}
}
return new Point(width, Math.max(height, 0));
}
@Override
protected void layout(Composite composite, boolean flushCache) {
Control[] children = composite.getChildren();
Rectangle available = composite.getClientArea();
int x = available.x;
int consumedPercent = 0;
for (int i = 0; i < children.length - 1; i++) {
int percent;
if (i >= percentages.length) {
percent = (100 - consumedPercent) / (children.length - percentages.length);
} else {
percent = percentages[i];
consumedPercent += percent;
}
int w = available.width * percent / 100;
children[i].setBounds(x, available.y, w, available.height);
x += w;
}
if (children.length > 0) {
children[children.length - 1].setBounds(x, available.y,
available.width - (x - available.x), available.height);
}
}
}
也就是说,我现在通常只是将我想要包装的标签放在一个额外的“笼子”复合材料中,这限制了它们的水平尺寸要求。