2013-05-30 8 views
5

Ho un'applicazione RCP/SWT in cui sto cercando di costruire una vista con i compositi esistenti. Uno è un composito FillLayout, l'altro utilizza GridLayout.posso combinare SWT GridLayout e FillLayout

Mi piacerebbe finire con una vista in cui il composito GridLayout è allineato a sinistra del composito FillLayout (si pensi al banner verticale) ed è circa il 10% della larghezza dell'intera vista, con l'esistente FillLayout composito comprendente l'altro 90 percento.

Non sono sicuro che sia possibile in SWT combinare i layout, ma sto pensando a qualcosa come GridLayout con due colonne. La prima colonna conterrebbe il widget GridLayout e la colonna due conterrà il composito FillLayout. Questo può essere fatto in SWT? In caso affermativo, che cosa significa questo in termini di codice?

grazie-

risposta

7

Avviare un FormLayout al composito esterno. Metti due altri materiali compositi al suo interno, impostando le loro informazioni FormData per posizionarli come preferisci. Quindi imposta i due layout di questi compositi (griglia e riempimento, come hai detto tu).

Ecco un codice per iniziare. C'è un'immagine dopo che mostra ciò che produce. Si potrebbe anche verificare la vista di SWT Layout di Eclipse.

Shell shell = new Shell(); 

FillLayout fillLayout = new FillLayout(); 
fillLayout.marginHeight = 5; 
fillLayout.marginWidth = 5; 
shell.setLayout(fillLayout); 

Composite outer = new Composite(shell, SWT.BORDER); 
outer.setBackground(new Color(null, 207, 255, 206)); // Green 

FormLayout formLayout = new FormLayout(); 
formLayout.marginHeight = 5; 
formLayout.marginWidth = 5; 
formLayout.spacing = 5; 
outer.setLayout(formLayout); 

Composite innerLeft = new Composite(outer, SWT.BORDER); 
innerLeft.setLayout(new GridLayout()); 
innerLeft.setBackground(new Color(null, 232, 223, 255)); // Blue 

FormData fData = new FormData(); 
fData.top = new FormAttachment(0); 
fData.left = new FormAttachment(0); 
fData.right = new FormAttachment(10); // Locks on 10% of the view 
fData.bottom = new FormAttachment(100); 
innerLeft.setLayoutData(fData); 

Composite innerRight = new Composite(outer, SWT.BORDER); 
innerRight.setLayout(fillLayout); 
innerRight.setBackground(new Color(null, 255, 235, 223)); // Orange 

fData = new FormData(); 
fData.top = new FormAttachment(0); 
fData.left = new FormAttachment(innerLeft); 
fData.right = new FormAttachment(100); 
fData.bottom = new FormAttachment(100); 
innerRight.setLayoutData(fData); 

shell.open(); 

Code output

2

È possibile utilizzare il seguente codice come punto di partenza:

public static void main(String[] args) 
{ 
    Display display = new Display(); 
    Shell shell = new Shell(display); 
    shell.setLayout(new GridLayout(1, false)); 

    SashForm form = new SashForm(shell, SWT.HORIZONTAL); 
    form.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 

    Composite left = new Composite(form, SWT.BORDER); 
    left.setLayout(new GridLayout(3, true)); 
    left.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 

    for(int i = 0; i < 9; i++) 
    { 
     Button button = new Button(left, SWT.PUSH); 
     button.setText("Button " + i); 
     button.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true)); 
    } 

    final Composite right = new Composite(form, SWT.BORDER); 
    right.setLayout(new GridLayout(1, true)); 
    right.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 

    Button fillButton = new Button(right, SWT.PUSH); 
    fillButton.setText("Fill"); 
    fillButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 

    /* Set the width to 80% and 20% */ 
    form.setWeights(new int[] {4, 1}); 

    shell.setSize(400, 400); 
    shell.open(); 
    while (!shell.isDisposed()) 
    { 
     if (!display.readAndDispatch()) 
      display.sleep(); 
    } 
    display.dispose(); 
} 

Ecco come si presenta:

enter image description here


E 'fondamentalmente un SashForm con due parti. La parte sinistra è una GridLayout con tre colonne e la parte destra è una GridLayout con una colonna. Non c'è bisogno di mescolare Layout s.

La percentuale è stabilita con l'impostazione form.setWeights(new int[] {4, 1});