2009-06-07 82 views
5

我想为使用SWT的应用程序之一构建主 - 布局布局。SWT:使用ScrolledComposite的嵌套布局超出可用空间

Container,Content,Sidebar和Part1是Composite实例。 滚动是ScrolledComposite

所需的布局是一样的东西:

+--Container-------------------------------------+ 
|+--Content----------------------++--Sidebar----+| 
||        ||+--Part1----+|| 
||        |||   ||| 
||        |||   ||| 
||        |||   ||| 
||        |||   ||| 
||        |||   ||| 
||        ||+-----------+|| 
||        ||+--Scrolled-+|| 
||        |||   ||| 
||        |||   ||| 
||        |||   ||| 
||        |||   ||| 
||        |||   ||| 
||        ||+-----------+|| 
|+-------------------------------++-------------+| 
+------------------------------------------------+ 

内容应水平抓住所有的空间和垂直方向可用。

侧栏基本上是Part1和Scrolled的容器,它们应该具有相同的高度。

滚动是包含被布置在所述内容复合子项的动态数的复合容器。由于子项数量可能会有很大的变化,因此该组合应该是可滚动的。

下列方式我现在已经实现了这个:

  • 集装箱有2个colums一个网格布局。

  • 里面的内容有FILL_BOTH行为和争夺也都水平/垂直空间。

  • 侧栏有一个FillLayout的(SWT.VERTICAL),包含第1部分和滚动童车。

问题: 当投入大量项目进入滚动复合材料和布局只是溢出的可用空间,并且没有可用的滚动,它应该是。

当我使用一个FillLayout的(SWT.HORIZONTAL),用于容器中的行为是如所期望的,因为有一个滚动和一切为“内部边界”。

有没有办法使用网格布局的时候,因为我想要抓住大部分空间的内容也能达到这种行为。

附当前测试SWT片段:

public class Scrolled { 
    public static void main(String[] args) { 
     Display display = new Display(); 
     Shell shell = new Shell(display); 
     shell.setLayout(new GridLayout(2,false)); 
     //shell.setLayout(new FillLayout(SWT.HORIZONTAL)); 

     Composite content = new Composite(shell, SWT.BORDER); 
     content.setLayoutData(new GridData(SWT.LEFT,SWT.CENTER,false,false)); 

     Composite sidebar = new Composite(shell, SWT.BORDER); 
     sidebar.setLayout(new FillLayout(SWT.VERTICAL)); 
     sidebar.setLayoutData(new GridData(SWT.LEFT,SWT.CENTER,false,false)); 

     Composite cc = new Composite(sidebar, SWT.BORDER); 

     ScrolledComposite sc = new ScrolledComposite(sidebar, SWT.BORDER 
       | SWT.V_SCROLL | SWT.H_SCROLL); 
     sc.setLayout(new GridLayout(1,true)); 

     Composite c = new Composite(sc, SWT.NONE); 
     c.setSize(400, 400); 
     c.setLayout(new GridLayout(1, true)); 

     for(int i = 0; i < 1000; i++){ 
      new Button(c, SWT.PUSH).setText("Text"); 
     } 

     sc.setMinSize(c.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
     sc.setContent(c); 
     sc.setExpandHorizontal(true); 
     sc.setExpandVertical(true); 
     sc.setAlwaysShowScrollBars(true); 

     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) 
       display.sleep(); 
     } 
     display.dispose(); 
    } 
} 

回答

5

好像我找到了解决办法。

似乎是一个复合材料具有采取GRAB_EXCESS_VERTICAL受限于可用的宽度的情况。否则,组件将被指定为一次显示的最大高度的首选高度。

下面的代码更改的伎俩:

content.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true)); 

sidebar.setLayoutData(new GridData(SWT.FILL,SWT.FILL,false,true));