我正在使用带有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列的GridLayout
。 GridLayout
从左上方到右下方填充。如果要使两个元素彼此相邻而不是彼此相邻,则有两个选项:
在两者之间添加一个空的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();
}
看起来像这样: