2013-06-19 10 views
8

Używam układu siatki w powłoce. Chcę kontrolować lokalizację widżetów. Jak widać, dolne przyciski muszą znajdować się w rzędzie 4. Używam wtyczki windowbuilder i mogę umieścić je w pożądanych miejscach.Jak ustawić wiersze i kolumny widgetu w układzie siatki?

my shell using windowbuilder

Problemem jest to, że nie można zobaczyć instrukcje umieszczania w kodzie źródłowym. Jak mogę je ustawić programowo? Oto generator kodu źródłowego generujący okno.

package dgsj.Chapter04.examples.ch4; 

import org.eclipse.swt.widgets.*; 

public class GridLayout2x2 { 
    private static GridData data_1; 
    private static GridData data_2; 

    public static void main(String[] args) { 
     Display display = new Display(); 
     Shell shell = new Shell(display); 
     shell.setMinimumSize(new Point(123, 30)); 
     shell.setSize(126, 123); 
     GridLayout layout = new GridLayout(); 
     layout.numColumns = 3; 
     shell.setLayout(layout); 

     GridData data = new GridData(GridData.FILL_BOTH); 
     data.grabExcessHorizontalSpace = false; 
     data.widthHint = 200; 
     data.grabExcessVerticalSpace = false; 
     Button one = new Button(shell, SWT.PUSH); 
     one.setText("one"); 
     one.setLayoutData(data); 

     data = new GridData(GridData.FILL_BOTH); 
     Button two = new Button(shell, SWT.PUSH); 
     two.setText("two"); 
     two.setLayoutData(data); 
     new Label(shell, SWT.NONE); 
     new Label(shell, SWT.NONE); 

     data_2 = new GridData(GridData.FILL_BOTH); 
     Button four = new Button(shell, SWT.PUSH); 
     four.setText("four"); 
     four.setLayoutData(data_2); 
     new Label(shell, SWT.NONE); 
     new Label(shell, SWT.NONE); 
     new Label(shell, SWT.NONE); 

     new Label(shell, SWT.NONE); 
     new Label(shell, SWT.NONE); 

     Button btnNewButton = new Button(shell, SWT.NONE); 
     btnNewButton.setText("New Button"); 

     data_1 = new GridData(GridData.FILL_BOTH); 
     data_1.grabExcessVerticalSpace = false; 
     data_1.grabExcessHorizontalSpace = false; 
     Button three = new Button(shell, SWT.PUSH); 

     three.setText("three"); 
     three.setLayoutData(data_1); 

     shell.pack(); 
     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) { 
       display.sleep(); 
      } 
     } 
     display.dispose(); 
    } 
} 
+0

są takie puste „komórki” tej siatki rzekomej do domu żadnych innych informacji? –

+0

W niektórych widokach są one całkowicie puste, a ich jedynym celem jest dostosowanie układu. W niektórych innych widokach znajduje się etykieta sprawdzania poprawności, która staje się widoczna, aby pokazać jakiś błąd. –

Odpowiedz

10

Jedynym sposobem, aby „przeskoczyć” kilka komórek w GridLayout jest, aby wypełnić je z pustymi kontroli, a to co robi WindowBuilder z tych new Label(shell, SWT.NONE); linii. Jeśli chcesz umieścić programowo w danej linii/kolumnie programowo, będziesz musiał policzyć wymaganą liczbę pustych Label s (lub innych niewidocznych kontrolek) do dodania.

+0

Masz całkowicie rację. Dzięki –

3

Lepiej użyj FormLayout, który jest bardziej elastyczny niż GridLayout. Jeśli jest to potrzebne, można uzyskać widget FormData, zmienić jego ustawienia, a następnie wymusić zmianę układu, aby zmienić położenie widgetów w środowisku wykonawczym.

Widok Eclipse's SWT Layout może być dla Ciebie bardzo pomocny.

Oto niektóre kodu, który odwzorowuje układ:

import org.eclipse.swt.*; 
import org.eclipse.swt.layout.*; 
import org.eclipse.swt.widgets.*; 

public class MyLayout { 
    public static void main (String [] args) { 
     Display display = new Display(); 
     Shell shell = new Shell (display); 
     FormLayout formLayout = new FormLayout(); 
     shell.setLayout (formLayout); 

     Button button0 = new Button (shell, SWT.PUSH); 
     button0.setText ("button0"); 
     FormData data = new FormData(); 
     data.left = new FormAttachment (0, 0); 
     data.right = new FormAttachment (button1, 0, SWT.DEFAULT); 
     button0.setLayoutData (data); 

     Button button1 = new Button (shell, SWT.PUSH); 
     button1.setText ("button1"); 
     data = new FormData(); 
     data.left = new FormAttachment (button3, 0, SWT.LEFT); 
     data.right = new FormAttachment (button3, 0, SWT.RIGHT); 
     button1.setLayoutData (data); 

     Button button2 = new Button (shell, SWT.PUSH); 
     button2.setText ("button2"); 
     data = new FormData(); 
     data.left = new FormAttachment (button3, 0, SWT.LEFT); 
     data.right = new FormAttachment (button3, 0, SWT.RIGHT); 
     data.top = new FormAttachment (button1, 0, SWT.DEFAULT); 
     button2.setLayoutData (data); 

     Button button3 = new Button (shell, SWT.PUSH); 
     button3.setText ("button3"); 
     data = new FormData(); 
     data.right = new FormAttachment (button4, 0, SWT.DEFAULT); 
     data.bottom = new FormAttachment (100, 0); 
     button3.setLayoutData (data); 

     Button button4 = new Button (shell, SWT.PUSH); 
     button4.setText ("button4"); 
     data = new FormData(); 
     data.right = new FormAttachment (100, 0); 
     data.bottom = new FormAttachment (100, 0); 
     button4.setLayoutData (data); 

     shell.pack(); 
     shell.open(); 

     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) 
       display.sleep(); 
      } 

     display.dispose(); 
    } 
} 
+2

Dzięki, ale problem polega na tym, że piszemy narzędzie, a nasi użytkownicy tworzą formularze za pomocą narzędzia, które rozwijamy. Niestety użycie układu formularza byłoby dla nich zbyt skomplikowane. Sądzę, że utknąłem w układzie siatki. –

Powiązane problemy