4

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

当使用带有多个具有抓取过多水平空间选项的项目的网格布局时- 特别是TablesTrees等 - 布局会根据各种因素自动确定如何分割多个项目之间的空间,例如每个项目有多少列项目有。这导致它们之间的空间分配不均,这是设计故意的,通常是一件好事。

30/70 拆分

如果希望空间被完美地分割,那么还有一个使列的大小相同的选项。

50/50 拆分

但是,是否可以为列定义不同的、非自动的、非等间距百分比? 例如,是否有可能让我的示例中的项目有 80/20 的拆分,较大的金额用于列较少的项目,或者通过自动方法将其视为较小的项目?

4

3 回答 3

2

与此答案非常相关:

是的,这是可能的,但并不像GridLayout#setWeight(col, weight). 不幸的是,您必须监听(或包含您的容器)Resize的事件,然后设置包含的组件的 。下面的代码将百分比设置为 75% 和 25%:ShellGridLayoutGridData

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

启动后:

在此处输入图像描述

调整大小后:

在此处输入图像描述

于 2013-10-26T08:31:51.410 回答
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);
    }
  }
}

也就是说,我现在通常只是将我想要包装的标签放在一个额外的“笼子”复合材料中,这限制了它们的水平尺寸要求。

于 2016-11-30T22:35:59.640 回答
-1

是的,您可以像这样以编程方式执行此操作:

  1. 获取屏幕大小

  2. 根据屏幕编辑GridView's 大小(例如,将大小设置为屏幕的 1/2 为 50%)

  3. 通过调用刷新页面view.invalidate()

于 2013-10-25T22:28:25.170 回答