2009-06-07 7 views
5

Я хочу построить макет Master-Detail для одного из моих приложений с использованием SWT.SWT: Вложенные макеты с ScrolledComposite превышают доступное пространство

Контейнер, содержимое, боковая панель и часть 1 являются составными экземплярами. прокручивается является ScrolledComposite

Требуемый макет что-то вроде:

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

содержание должно захватить все пространство по горизонтали и вертикали, что доступно.

Боковая панель в основном представляет собой контейнер для части 1 и прокрутки, который должен быть одинаковой высоты.

Прокрутка - это контейнер для композитного материала, содержащий динамическое количество подпунктов, которые расположены в составном композите. Поскольку может быть большое изменение количества подпунктов, этот композит должен прокручиваться.

Я теперь реализованы это следующим образом:

  • Контейнер имеет GridLayout с 2 colums.

  • Внутри этого контента действует поведение FILL_BOTH и также захватывается все пространство HORIZONTAL/VERTICAL.

  • На боковой панели есть FillLayout (SWT.VERTICAL) и содержит Part1 и Scrolled Childs.

Проблема: Когда положить много элементов в прокрученном композит и расположение просто переполняет доступное пространство и нет прокрутки доступна, где она должна быть.

Когда я использую FillLayout (SWT.HORIZONTAL) для контейнера, поведение по своему желанию, так как есть прокрутка и все есть «внутри границ».

Есть ли способ достичь этого поведения также при использовании GridLayout, потому что я хочу, чтобы контент захватывал большую часть пространства.

Прикрепленный текущий тест 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));