网格布局 - 共享相对空间

时间:2013-10-25 22:03:18

标签: java layout swt

是否可以为网格布局中的列定义手动比率,这些列都会占用多余的水平空间?

使用网格布局 <多个项目 抓住过多的水平空间选项 - 特别是< strong>表,等 - 布局会根据各种因素(例如每个项目有多少列)自动确定如何拆分多个项目之间的空间。这导致空间在它们之间不均匀地分开,这是有意设计的,通常是好事。

30/70 Split

如果有人想要将空间完美地拆分,那么使列具有相同大小的选项。

50/50 Split

但是,是否可以为列定义不同的,非自动的,非等空间百分比?例如,是否可以让我的示例中的项目具有80/20用较大的数量分配到具有较少列的项目,或者通过自动方法被认为较小的项目?

3 个答案:

答案 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();
}

开始后:

enter image description here

调整大小后:

enter image description here

答案 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)

是的,你可以这样编程:

  1. 获取屏幕大小

  2. 根据屏幕编辑GridView的尺寸(例如,将尺寸设置为屏幕的1/2,持续50%)

  3. 通过调用view.invalidate()

  4. 刷新页面