是否可以为网格布局中的列定义手动比率,这些列都会占用多余的水平空间?
使用网格布局与 <多个项目 抓住过多的水平空间选项 - 特别是< strong>表,树等 - 布局会根据各种因素(例如每个项目有多少列)自动确定如何拆分多个项目之间的空间。这导致空间在它们之间不均匀地分开,这是有意设计的,通常是好事。
如果有人想要将空间完美地拆分,那么使列具有相同大小的选项。
但是,是否可以为列定义不同的,非自动的,非等空间百分比?例如,是否可以让我的示例中的项目具有80/20用较大的数量分配到具有较少列的项目,或者通过自动方法被认为较小的项目?
答案 0 :(得分:2)
与this回答非常相关:
是的,这是可能的,但它并不像GridLayout#setWeight(col, weight)
那么容易。不幸的是,您必须收听Resize
(或包含Shell
的容器)的GridLayout
个事件,然后设置所包含组件的GridData
。下面的代码将百分比设置为75%和25%:
public static void main(String[] args)
{
Display display = Display.getDefault();
final Shell shell = new Shell(display);
shell.setLayout(new GridLayout(2, false));
Composite left = new Composite(shell, SWT.BORDER);
Composite right = new Composite(shell, SWT.BORDER);
final GridData leftData = new GridData(SWT.FILL, SWT.FILL, true, true);
final GridData rightData = new GridData(SWT.FILL, SWT.FILL, true, true);
left.setLayoutData(leftData);
right.setLayoutData(rightData);
shell.addListener(SWT.Resize, new Listener()
{
@Override
public void handleEvent(Event arg0)
{
Point size = shell.getSize();
leftData.widthHint = (int) (size.x * 0.75);
rightData.widthHint = size.x - leftData.widthHint;
System.out.println(leftData.widthHint + " + " + rightData.widthHint + " = " + size.x);
}
});
shell.pack();
shell.open();
shell.layout();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
开始后:
调整大小后:
答案 1 :(得分:1)
您可以使用具有更多列数的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);
}
}
}
那就是说,我现在通常只是将标签放在一个额外的“笼子”复合材料中,以限制它们的水平尺寸要求。
答案 2 :(得分:-1)
是的,你可以这样编程:
获取屏幕大小
根据屏幕编辑GridView
的尺寸(例如,将尺寸设置为屏幕的1/2,持续50%)
通过调用view.invalidate()