【问题标题】:Center ok and cancel button with GridLayout使用 GridLayout 居中确定并取消按钮
【发布时间】:2016-03-11 22:48:52
【问题描述】:

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

这是我当前的代码:

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

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

应该是这样的:

+++ 已编辑 +++

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

我现在使用两种组合 - 一种用于“主”控件,一种用于按钮。
我坐在一个 GridLayout 和一个 cloumn 到窗口以将复合材料彼此放置。
按钮组合也有一个 GridLayout,但有两列用于确定和取消。然后我可以使用 GridData 对象将窗口中的按钮居中。
我唯一的问题是按钮之间的水平间距。我必须将其设置为绝对值,但最好有一个动态值(可能取决于窗口的整个宽度)。但我还没有意识到这一点。
这是我构建的:

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

【问题讨论】:

    标签: java layout swt


    【解决方案1】:

    如果您想根据窗口的宽度确定间距,您可以收听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();
    }
    

    看起来像这样:

    【讨论】:

    • 你的想法很酷,但现在我遇到了一些奇怪效果的问题:窗口突然变大了一倍(380 像素而不是之前的 190),我的文本字段是 400 像素(比窗口本身)并与窗口的右边缘重叠。不知道 GridLayout 在这里计算什么...
    • @altralaser 如果没有看到您的最终代码,我也不知道。
    • @altralaser 更新了我的答案。它不再依赖Labels。
    • 首先,感谢您的帮助!不幸的是,您的代码结果与我的第一个示例相同。现在唯一的区别是左右边距更宽。但是按钮不在文本字段或复选框的中心,并且在确定和取消之间没有“好的”边距。请问您在对话框中使用什么来放置“确定”和“取消”按钮?可能有某种非官方标准之类的东西吗?
    • @altralaser 请张贴一张你想要的图片,因为我想我不明白你想要什么。
    猜你喜欢
    • 2019-09-06
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    相关资源
    最近更新 更多