2013-10-25 108 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); 
        } 
        } 
    } 
    

    這就是說,我現在通常只是扣帽子我想包裝只是一個額外的「籠子」複合材料,其限制了他們的水平尺寸要求