我正在使用带有2列的Gridlayout。我有标签和相应的文本控件。我希望第一个标签的Text控件向下滑动标签,而不是紧靠其旁边(因为其网格布局)。为此,我认为moveBelow方法可以工作,但似乎不可行。我是否错误地解释了该方法的使用?

Label label = Components.createLabel(myContainer, SWT.LEFT
                | SWT.WRAP);
        abel.setText("WC Plan Name");
        textName = createTextControl(myContainer, SWT.LEFT);
        textName.moveBelow(label);

private Text createTextControl(Composite parent, int horizontalAlignment)
    {
        final Text textControl = Components.createText(parent, SWT.SINGLE | SWT.BORDER);
        final GridData layoutData = new GridData(horizontalAlignment, SWT.FILL, false, false);
        layoutData.widthHint = 200;
        textControl.setLayoutData(layoutData);
        return textControl;
    }

最佳答案

moveBelow()完全按照文档中的说明进行操作:


  按图纸顺序将接收器移动到指定控件的下方。如果参数为null,则将接收器移至绘制顺序的底部。绘制顺序底部的控件将被占据相交区域的所有其他控件覆盖。


这意味着它可以用于对子级进行重新排序(如果父级的布局允许)。例如,如果您有一个RowLayout并在最后一个孩子上调用moveBelow(null),它将被移到顶部。



现在解决您的问题:您有一个带有2列的GridLayoutGridLayout从左上方到右下方填充。如果要使两个元素彼此相邻而不是彼此相邻,则有两个选项:


在两者之间添加一个空的Label,以便它可以占据第一个元素右侧的空间
GridData添加到第一个元素,并将GridData#horizontalSpan设置为2。这样,它将跨越两列。




更新

这是解决方案2的示例:

public static void main(String[] args)
{
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setText("StackOverflow");
    shell.setLayout(new GridLayout(4, false));

    Text text = new Text(shell, SWT.BORDER);
    text.setLayoutData(new GridData(SWT.BEGINNING, SWT.TOP, false, true, 4, 1));

    text = new Text(shell, SWT.BORDER);
    text.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true, 4, 1));

    for (int i = 0; i < 8; i++)
    {
        new Button(shell, SWT.PUSH).setText("Button " + i);
    }

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

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


看起来像这样:

09-12 11:57