2009-06-07 12 views
5

Chcę zbudować układ szczegółów głównych dla jednej z moich aplikacji przy użyciu SWT.SWT: Rozgałęzione układy z przewiniętym układem przekraczają dostępne miejsce

Kontener, zawartość, pasek boczny i część 1 to instancje złożone. Scrolled jest ScrolledComposite

pożądany układ jest coś takiego:

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

treść powinna chwycić całą przestrzeń w pionie i poziomie, który jest dostępny.

Pasek boczny to w zasadzie kontener dla części 1 i przewijany, który powinien być jednakowej wysokości.

Przewijany jest pojemnik na kompozyt zawierający dynamiczną liczbę elementów podrzędnych ułożonych w kompozycie treści. Ponieważ może występować duża zmienność liczby podpunktów, ten kompozyt powinien być przewijany.

Mam teraz ten realizowany w następujący sposób:

  • Pojemnik ma GridLayout z 2 colums.

  • Wewnątrz tej treści ma zachowanie FILL_BOTH i chwyta również całą przestrzeń HORIZONTAL/VERTICAL.

  • Pasek boczny ma wypełnienie FillLayout (SWT.VERTICAL) i zawiera części 1 i przewijane elementy potomne.

Problem: Gdy oddanie dużo elementów do przewijane kompozytowy i układ po prostu przelewa się w wolnej przestrzeni i nie ma przewijanie dostępny gdzie powinno być.

Kiedy używam FillLayout (SWT.HORIZONTAL) dla kontenera, zachowanie jest zgodne z oczekiwaniami, ponieważ jest przewijanie i wszystko jest "w granicach".

Czy istnieje sposób na osiągnięcie tego zachowania również przy korzystaniu z GridLayout, ponieważ chcę, aby zawartość chwytała większość przestrzeni.

dołączony aktualny testu SWT fragment:

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

Odpowiedz

5

Wygląda znalazłem rozwiązanie.

Wygląda na to, że kompozyt musi przyjąć GRAB_EXCESS_VERTICAL, aby ograniczyć się do dostępnej szerokości. W przeciwnym razie składnik zostanie przypisany do preferowanej wysokości, która jest maksymalną wysokością do wyświetlania wszystkich naraz.

następujące zmiany kodu wystarczyły:

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

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