9

シェルでグリッド レイアウトを使用しています。ウィジェットの位置を制御したい。ご覧のとおり、一番下のボタンは 4 行目に配置する必要があります。私は windowbuilder プラグインを使用しており、必要な場所に配置できます。

windowbuilderを使用した私のシェル

問題は、ソース コードに配置命令が表示されないことです。それらをプログラム的な方法で配置するにはどうすればよいですか。ウィンドウ ビルダーが生成するソース コードを次に示します。

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

2 に答える 2

11

一部のセルを「スキップ」する唯一の方法は、それらのセルにGridLayout空のコントロールを入力することです。それが WindowBuilder がそれらのnew Label(shell, SWT.NONE);行に対して行うことです。Labelプログラムで特定の行/列にコントロールを配置する場合は、追加するために必要な空の s (またはその他の非表示のコントロール) の数をカウントする必要があります。

于 2013-06-19T15:03:01.140 に答える
3

FormLayoutより柔軟な を使用することをお勧めしますGridLayout。必要に応じて、ウィジェットを取得し、FormDataその設定を変更してから、実行時に再レイアウトを強制してウィジェットを再配置できます。

Eclipse のSWT Layoutビューは、あなたにとって非常に役立つかもしれません。

レイアウトを再現するコードを次に示します。

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 ();
    }
}
于 2013-06-20T12:40:05.840 に答える