Pregunta

Quiero construir un diseño de Maestro-Detalle de una de mis aplicaciones utilizando SWT.

Container, contenido, y la barra lateral Parte 1 son ejemplos de composición. Scrolled es un ScrolledComposite

El diseño deseado es algo 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 ser de la misma altura.

Scrolled es el contenedor de un material compuesto que contiene un número dinámico de sub elementos que están dispuestas en el material compuesto contenido. Debido a que no puede haber una gran variación del número de sub-elementos, este compuesto debe ser desplazable.

He implementado ahora esto de la siguiente manera:

  • recipiente tiene un GridLayout con 2 columnas.

  • Dentro de que el contenido tiene un comportamiento y agarra FILL_BOTH también todos los HORIZONTAL / espacio vertical.

  • La barra lateral tiene una FillLayout (SWT.VERTICAL) y contiene el Part1 y Scrolled Childs.

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 una FillLayout (SWT.HORIZONTAL) para el contenedor el comportamiento es como se desea, ya que hay un desplazamiento y todo es "límites dentro".

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

Se adjunta 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();
    }
}
¿Fue útil?

Solución

parece que he encontrado la solución.

Parece ser el caso de que un compuesto tiene que tomar GRAB_EXCESS_VERTICAL estar limitada a la anchura disponible. De lo contrario el componente se le asigna la altura preferida, que es la altura máxima para visualizar todos 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));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top