中心确定并使用GridLayout取消按钮

时间:2015-12-07 10:50:54

标签: java layout swt

我构建了自己的查找对话框,其中包含一些组件来配置搜索,我想使用GridLayout布局控件。
但是我无法放置确定和取消按钮。我想将这些按钮居中,使得窗口左边缘和ok按钮之间的边距,ok和取消按钮之间的边距以及取消按钮和窗口右边缘之间的边距是相同的。

这是我目前的代码:

public class Main {
  public static void main(String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);
    GridLayout gridLayout = new GridLayout();
    gridLayout.horizontalSpacing = 0;
    gridLayout.makeColumnsEqualWidth = true;
    gridLayout.marginHeight = 10;
    gridLayout.marginWidth = 10;
    gridLayout.numColumns = 5;
    gridLayout.verticalSpacing = 10;
    shell.setLayout(gridLayout);
    shell.setText("Find");

    GridData gridData = new GridData();
    gridData.horizontalSpan = 5;
    Label label1 = new Label(shell, SWT.NONE);
    label1.setLayoutData(gridData);
    label1.setText("Please enter the find text in the field below:");

    gridData = new GridData(GridData.FILL_HORIZONTAL);
    gridData.horizontalSpan = 5;
    Text text1 = new Text(shell, SWT.BORDER | SWT.H_SCROLL | SWT.SINGLE);
    text1.setLayoutData(gridData);

    gridData = new GridData();
    gridData.horizontalSpan = 5;
    Button check1 = new Button(shell, SWT.CHECK);
    check1.setLayoutData(gridData);
    check1.setText("Match case sensitivity");

    new Label(shell, SWT.NONE);

    Button okButton = new Button(shell, SWT.PUSH);
    okButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
    okButton.setText("&OK");
    shell.setDefaultButton(okButton);

    new Label(shell, SWT.NONE);

    Button cancelButton = new Button(shell, SWT.PUSH);
    cancelButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
    cancelButton.setText("&Cancel");

    new Label(shell, SWT.NONE);

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

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

我的问题是取消按钮似乎居中但是ok按钮仍然在左边对齐 我想要的是一个位置,例如:左边缘,50像素,ok按钮,50像素,取消按钮,50像素,右边缘。

它应该是这样的:

enter image description here

+++ EDITED +++

好的,我找到了解决方案。它并不完美,但它以令人满意的方式符合我的要求:

我现在正在使用两种复合材料 - 一种用于" main"控件和按钮之一 我坐在一个带有一个cloumn的GridLayout窗口,将复合材料放在彼此之间 按钮组合也有一个GridLayout,但有两列用于ok和cancel。然后我能够使用GridData对象将窗口中的按钮居中 我唯一的问题是按钮之间的horizo​​ntalSpacing。我不得不将其设置为绝对值,但最好有一个动态值(可能取决于窗口的整个宽度)。但我还是不知道这一点 这是我建立的:

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

    Composite mainComp = new Composite(shell, SWT.NONE);
    mainComp.setLayout(new GridLayout(1, false));
    mainComp.setLayoutData(new GridData());

    Label label1 = new Label(mainComp, SWT.NONE);
    label1.setLayoutData(new GridData());
    label1.setText("Please enter the find text in the field below:");

    Text text1 = new Text(mainComp, SWT.BORDER | SWT.H_SCROLL | SWT.SINGLE);
    text1.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

    Button check1 = new Button(mainComp, SWT.CHECK);
    check1.setLayoutData(new GridData());
    check1.setText("Match case sensitivity");

    Composite buttonComp = new Composite(shell, SWT.NONE);
    GridLayout buttonCompLayout = new GridLayout();
    buttonCompLayout.horizontalSpacing = 50;
    buttonCompLayout.numColumns = 2;
    buttonComp.setLayout(buttonCompLayout);
    buttonComp.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));

    Button okButton = new Button(buttonComp, SWT.PUSH);
    okButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
    okButton.setText("&OK");
    shell.setDefaultButton(okButton);

    Button cancelButton = new Button(buttonComp, SWT.PUSH);
    cancelButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
    cancelButton.setText("&Cancel");

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

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

1 个答案:

答案 0 :(得分:0)

如果您希望将间距基于窗口宽度,则可以收听SWT.Resize,然后更新GridLayout#horizontalSpacing。然后,在父母身上调用layout()

public static void main(String[] args)
{
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setText("StackOverflow");
    shell.setLayout(new GridLayout());
    shell.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

    final Composite comp = new Composite(shell, SWT.BORDER);

    final GridLayout layout = new GridLayout(2, false);
    layout.horizontalSpacing = 50;

    comp.setLayout(layout);
    comp.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, false));

    Button first = new Button(comp, SWT.PUSH);
    first.setText("First");
    first.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));

    Button second = new Button(comp, SWT.PUSH);
    second.setText("Second");
    second.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));

    shell.addListener(SWT.Resize, new Listener()
    {
        @Override
        public void handleEvent(Event event)
        {
            int width = shell.getSize().x;
            layout.horizontalSpacing = (int) Math.round(0.1 * width);
            shell.layout(true, true);
        }
    });

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

    shell.forceFocus();

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

看起来像这样:

enter image description here