2013-05-30 8 views
5

Mam aplikację RCP/SWT, w której próbuję zbudować widok z istniejących kompozytów. Jeden to kompozyt FillLayout, drugi to GridLayout.Czy mogę połączyć SWT GridLayout i FillLayout

Chciałbym skończyć z widokiem, w którym kompozycja GridLayout jest wyrównana na lewo od kompozytu FillLayout (myśl pionowy baner) i ma około 10 procent szerokości całego widoku, z istniejącym Kompozyt FillLayout zawierający pozostałe 90 procent.

Nie jestem pewien, czy w SWT możliwe jest łączenie układów, ale myślę o czymś takim jak GridLayout z dwiema kolumnami. Kolumna zawierająca widżet GridLayout, a druga kolumna zawierałaby kompozycję FillLayout. Czy można to zrobić w SWT? Jeśli tak, to co to wygląda w sensie kodowym?

Thanks-

Odpowiedz

7

rozpocząć FormLayout na swojej zewnętrznej kompozytu. Umieść w nim dwa inne kompozyty, ustawiając ich informacje, aby ustawić je tak, jak chcesz. Następnie ustaw te układy dwóch kompozytów (Siatka i Wypełnienie, jak powiedziałeś).

Oto kod do uruchomienia. Po nim widać obraz pokazujący, co on produkuje. Możesz również przejrzeć widok Eclipse z SWT Layouts.

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

Można użyć następującego kodu jako punktu wyjścia:

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

Wygląda to tak:

enter image description here


Jest to w zasadzie SashForm z dwie części. Lewa część to GridLayout z trzema kolumnami, a prawa część to GridLayout z jedną kolumną. Nie trzeba mieszać Layout s.

Procent jest ustawiony z ustawieniem form.setWeights(new int[] {4, 1});

Powiązane problemy