Domanda

Voglio creare un layout Master-Detail per una delle mie applicazioni utilizzando SWT.

Contenitore, Contenuto, Barra laterale e Parte 1 sono istanze composite.Scrolled è uno ScrolledComposite

Il layout desiderato è qualcosa del tipo:

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

Il contenuto dovrebbe occupare tutto lo spazio disponibile orizzontalmente e verticalmente.

La barra laterale è fondamentalmente un contenitore per Part1 e Scrolled che dovrebbero avere la stessa altezza.

Scorrito è il contenitore di un composito contenente un numero dinamico di sottoelementi disposti nel contenuto composito.Poiché può esserci una grande variazione nel numero di elementi secondari, questo composito dovrebbe essere scorrevole.

Ora l'ho implementato nel modo seguente:

  • Il contenitore ha un GridLayout con 2 colonne.

  • All'interno di ciò il contenuto ha il comportamento FILL_BOTH e occupa anche tutto lo spazio ORIZZONTALE/VERTICALE.

  • La barra laterale ha un FillLayout(SWT.VERTICAL) e contiene Part1 e Scrolled Childs.

Problema:Quando si inseriscono molti elementi nel composito con scorrimento, il layout supera lo spazio disponibile e non è disponibile lo scorrimento dove dovrebbe essere.

Quando utilizzo un FillLayout(SWT.HORIZONTAL) per il contenitore il comportamento è quello desiderato, poiché c'è uno scorrimento e tutto è "dentro i limiti".

Esiste un modo per ottenere questo comportamento anche quando si utilizza un GridLayout perché voglio che il contenuto occupi la maggior parte dello spazio.

In allegato lo snippet SWT del test corrente:

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();
    }
}
È stato utile?

Soluzione

sembra che ho trovato la soluzione.

Sembra essere il caso che un Composite debba prendere GRAB_EXCESS_VERTICAL essere limitato alla larghezza disponibile.Altrimenti al componente viene assegnata l'altezza preferita che è l'altezza massima da visualizzare tutto in una volta.

Le seguenti modifiche al codice hanno funzionato:

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

sidebar.setLayoutData(new GridData(SWT.FILL,SWT.FILL,false,true));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top