2009-06-07 6 views
5

Ich möchte ein Master-Detail-Layout für eine meiner Anwendungen mit SWT erstellen.SWT: Verschachtelte Layouts mit ScrolledComposite überschreiten verfügbaren Speicherplatz

Container, Inhalt, Sidebar und Part1 sind zusammengesetzte Instanzen. gescrollt wird ein ScrolledComposite

das gewünschte Layout ist so etwas wie:

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

Der Inhalt sollte horizontal den ganzen Raum packen und vertikal dass verfügbar ist.

Die Sidebar ist im Grunde ein Container für Part1 und Scrolled, der die gleiche Höhe haben sollte.

Scrolled ist der Container für einen Composite, der eine dynamische Anzahl von Unterobjekten enthält, die im Content Composite angeordnet sind. Da die Anzahl der Unterelemente stark variieren kann, sollte dieser Composite scrollbar sein.

Ich habe jetzt diese auf folgende Weise umgesetzt:

  • Container hat ein Gridlayout mit 2 colums.

  • Innerhalb davon hat der Inhalt FILL_BOTH Verhalten und ergreift auch alle HORIZONTAL/VERTICAL Raum.

  • Die Sidebar hat eine FillLayout (SWT.VERTICAL) und enthält die Part1 und Scrolled Childs.

Problem: Wenn viele Elemente in die gescrollt Verbund setzen und das Layout überläuft gerade den verfügbaren Platz und es gibt kein Scrollen zur Verfügung, wo es sein sollte.

Wenn ich eine FillLayout (SWT.HORIZONTAL) für den Container verwenden, ist das Verhalten wie gewünscht, da es ein Scrollen gibt und alles "innerhalb Grenzen" ist.

Gibt es eine Möglichkeit, dieses Verhalten auch bei Verwendung eines GridLayout zu erreichen, weil ich möchte, dass der Inhalt den meisten Platz einnimmt.

den aktuellen Test SWT-Schnipsel angeschlossen:

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

Antwort

5

scheint, wie ich die Lösung gefunden.

Scheint so, dass ein Composite GRAB_EXCESS_VERTICAL braucht, um auf die verfügbare Breite beschränkt zu sein. Andernfalls erhält die Komponente die bevorzugte Höhe, die die maximale Höhe ist, die auf einmal angezeigt werden soll.

Die folgenden Code-Änderungen haben den Trick:

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

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