2013-10-25 82 views
3

是否可以为网格布局中的列定义手动比率,它们都可以获取多余的水平空间?网格布局 - 共享相对空间

当使用网格布局多个项目具有的抓斗过度水平空间选项 - 尤其树木等 - 的布局自动确定如何分割多个项目之间的空间基于各种因素,例如每个项目有多少列。这导致它们之间的空间不均匀地分裂,这是有意设计的,通常是件好事。

30/70 Split

如果一个人要被拆分的空间完全均匀,有一个让列,相同的尺寸选项,以及。

50/50 Split

然而,是否有可能定义一个不同的,非自动的,非等于空间列的百分比是多少?例如,如果我的示例中的项目具有80/20的分割,而较大的数量转到具有较少列的项目,或者通过自动方法会被认为更小,那么是否有可能?

+0

对答案有任何反馈? – Baz

+0

@Baz还没有时间去测试它。不久。尽管我对你有完全的信心,但是,巴兹=) –

+1

够公平的,慢慢来。我只是想查看我给出的答案,看看他们是否能解决问题。 – Baz

回答

2

非常相关this回答:

是的,这是可能的,但它不像GridLayout#setWeight(col, weight)那么容易。不幸的是,您必须收听Shell(或容纳您的GridLayout的容器)的Resize事件,然后设置包含组件的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. 获取屏幕

  2. 编辑GridView的大小根据屏幕(EI上的尺寸大小设置为1。通过调用view.invalidate()

屏幕为50%)

  • 刷新页面/ 2

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

    这就是说,我现在通常只是扣帽子我想包装只是一个额外的“笼子”复合材料,其限制了他们的水平尺寸要求