2009-06-07 6 views
5

Je souhaite créer une disposition maître-détail pour l'une de mes applications utilisant SWT. Conteneur, Contenu, Barre latérale et Partie1 sont des instances composites.SWT: Les dispositions imbriquées avec ScrolledComposite dépassent l'espace disponible

Scrolled est un ScrolledComposite

La disposition 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 conteneur pour Part1 et Scrolled qui doit être de hauteur égale.

Défilement est le conteneur d'un composite contenant un nombre dynamique de sous-éléments 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 composite doit être défilable.

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

  • conteneur a un GridLayout avec 2 colonnes. A l'intérieur de cela le contenu a le comportement FILL_BOTH et saisit également tout l'espace HORIZONTAL/VERTICAL.

  • La barre latérale a un FillLayout (SWT.VERTICAL) et contient les éléments Part1 et Scrolled Childs.

Problème: Lorsque vous mettez beaucoup d'éléments dans le composite et la mise en page en rouleau déborde tout l'espace disponible et il n'y a pas de défilement disponible là où il devrait être. Lorsque j'utilise un FillLayout (SWT.HORIZONTAL) pour le conteneur, le comportement est comme souhaité, car il y a un défilement et tout est "à l'intérieur des limites".

Existe-t-il un moyen d'obtenir ce comportement également lors de l'utilisation d'un GridLayout, car je souhaite que le contenu récupère la plus grande partie de l'espace.

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

Répondre

5

semble que je trouve la solution.

Semble être le cas qu'un composite doit prendre GRAB_EXCESS_VERTICAL pour être limité à la largeur disponible. Sinon, le composant reçoit la hauteur préférée qui est la hauteur maximale à afficher en une seule 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)); 
Questions connexes