2009-06-07 16 views
5

Quiero crear un diseño de detalles maestros para una de mis aplicaciones mediante SWT.SWT: diseños anidados con ScrolledComposite excede el espacio disponible

Contenedor, Contenido, Barra lateral y Parte1 son instancias compuestas. Scrolled es un ScrolledComposite

El diseño deseado es algo así como:

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

el contenido debe agarrar todo el espacio horizontal y vertical que está disponible.

La barra lateral es básicamente un contenedor para Part1 y Scrolled que debe tener la misma altura.

Scrolled es el contenedor de un compuesto que contiene un número dinámico de elementos secundarios que están dispuestos en el compuesto de contenido. Debido a que puede haber una gran variación en el número de subtemas, este compuesto debe ser desplazable.

he implementado ahora esto de la siguiente manera:

  • contenedor tiene un GridLayout con 2 columnas.

  • Dentro de eso, el contenido tiene un comportamiento de FILL_BOTH y atrapa todo el espacio HORIZONTAL/VERTICAL.

  • La barra lateral tiene un FillLayout (SWT.VERTICAL) y contiene Part1 y Childs desplazados.

Problema: Al poner una gran cantidad de artículos en el material compuesto desplazado y la disposición a punto de desbordar el espacio disponible y no hay desplazamiento disponibles donde tiene que estar.

Cuando uso FillLayout (SWT.HORIZONTAL) para el contenedor, el comportamiento es el deseado, ya que hay un desplazamiento y todo está "dentro de límites".

Hay una manera de lograr este comportamiento también cuando uso un GridLayout porque quiero que el contenido ocupe la mayor parte del espacio.

Attached la corriente fragmento SWT prueba:

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

Respuesta

5

parece como he encontrado la solución.

Parece ser que un compuesto debe tomar GRAB_EXCESS_VERTICAL para limitarse al ancho disponible. De lo contrario, al componente se le asigna la altura preferida que es la altura máxima para mostrar todo a la vez.

Los siguientes cambios en el código resolvieron el problema:

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

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