Question

Je veux construire une mise en page maître-détail pour un de mes applications utilisant SWT.

Container, Content, la barre latérale et Part1 sont des instances composites. Scrolled est un ScrolledComposite

La mise en page souhaitée est quelque chose comme:

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

Le contenu doit saisir tout l'espace horizontal et vertical qui est disponible.

La barre latérale est essentiellement un récipient pour Part1 et Scrolled qui devrait être de hauteur égale.

Scrolled est le conteneur pour un composite contenant un nombre dynamique des points de sous qui sont disposés dans le composite de contenu. Parce qu'il peut y avoir une grande variation du nombre de sous-éléments, ce composé doit être scrollable.

Je suis maintenant mis en œuvre ce de la manière suivante:

  • Conteneur a un GridLayout avec 2 colonnes.

  • À l'intérieur de ce que le contenu a un comportement FILL_BOTH et saisit aussi tout l'espace Horizontale / Verticale.

  • La barre latérale a une FillLayout (SWT.VERTICAL) et contient le Part1 et Scrolled Childs.

Problème: Lorsque vous mettez beaucoup d'éléments dans le composite et la mise en défilement déborde l'espace disponible et il n'y a pas de défilement disponible là où il doit être juste.

Quand j'utilise un FillLayout (SWT.HORIZONTAL) pour le conteneur le comportement est tel que souhaité, car il y a un défilement et tout est « à l'intérieur des limites ».

Y at-il un moyen d'atteindre ce comportement aussi lors de l'utilisation d'un GridLayout parce que je veux que le contenu de saisir la majeure partie de l'espace.

joint l'extrait SWT test en cours:

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();
    }
}
Était-ce utile?

La solution

semble que je trouve la solution.

semble être le cas où un composite doit prendre GRAB_EXCESS_VERTICAL à être limitée à la largeur disponible. Sinon, le composant est attribué, la hauteur préférée qui est la hauteur maximale pour afficher à la fois.

Les modifications du code ci-dessous a fait l'affaire:

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

sidebar.setLayoutData(new GridData(SWT.FILL,SWT.FILL,false,true));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top