2013-06-19 29 views
8

Tôi đang sử dụng bố cục lưới trong vỏ. Tôi muốn kiểm soát vị trí của các vật dụng. Như bạn có thể thấy các nút dưới cùng phải ở trên hàng 4. Tôi đang sử dụng plugin trình xây dựng cửa sổ và có thể đặt chúng ở những vị trí mong muốn.Cách đặt hàng và cột của tiện ích trong bố cục lưới?

my shell using windowbuilder

Vấn đề là tôi không thể xem hướng dẫn vị trí trong mã nguồn. Làm thế nào tôi có thể đặt chúng theo cách có lập trình. Đây là trình tạo cửa sổ mã nguồn tạo ra.

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

Liệu các "tế bào" trống đó lưới phải chứa bất kỳ thông tin nào khác? –

+0

Trong một số giao diện, chúng hoàn toàn trống và mục đích duy nhất của chúng là điều chỉnh bố cục. Trong một số chế độ xem khác, có một nhãn xác thực hiển thị một số lỗi. –

Trả lời

10

Cách duy nhất để "bỏ qua" một số tế bào trong GridLayout là để lấp đầy chúng với các điều khiển trống rỗng, và đó là những gì WindowBuilder làm với những new Label(shell, SWT.NONE); dòng. Nếu bạn muốn đặt một điều khiển trên dòng/cột đã cho theo chương trình, bạn sẽ phải đếm số lượng yêu cầu của số trống Label s (hoặc các điều khiển vô hình khác) để thêm.

+0

Bạn hoàn toàn đúng. Cảm ơn –

3

Bạn nên sử dụng FormLayout, linh hoạt hơn GridLayout. Nếu bạn cần, bạn có thể nhận được một widget FormData, thay đổi cài đặt của nó và sau đó buộc bố cục lại để định vị lại các tiện ích khi chạy.

Chế độ xem SWT Layout của Eclipse có thể giúp ích rất nhiều cho bạn.

Dưới đây là một số mã mà tái bố trí của bạn:

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

Cảm ơn nhưng vấn đề là chúng tôi đang viết một công cụ và người dùng của chúng tôi là những người tạo biểu mẫu với công cụ chúng tôi đang phát triển. Rất tiếc, việc sử dụng bố cục biểu mẫu sẽ quá phức tạp đối với chúng. Vì vậy, tôi đoán tôi đang mắc kẹt với bố cục lưới. –

Các vấn đề liên quan