使GridLayout的列填充水平

时间:2014-08-16 09:52:40

标签: java alignment swt grid-layout

有一个给定的Formular,例如你在图片中可以看到的Formular。 我正在为swt,RCP-App编程。 我无法直接访问组件,但必须使用布局对齐它们。 首先,使用Gridlayout来对齐组件。 第一列包含标签,第二列包含文本字段。

剩下的是,我希望文本字段具有相同的宽度。 我原来的计划是让文本字段填充第二列水平然后做某事。像margin-right。

GridData具有以下功能:

GridData data = new GridData(SWT.FILL, SWT.NONE, true, false);
data.horizontalAlignment = GridData.FILL;
...

我使用GridLayout的代码如下所示:

GridLayout layout = new Gridlayout(2, false);

GridData data = new GridData(SWT.FILL, SWT.NONE, true, false);
data.horizontalAlignment = GridData.FILL;

parent.setLayout(layout); -> Produces the given image
parent.setLayoutData(data);
-> Seems to do nothing in combination with gridlayout, but the layout is needed

有更多不同宽度的字段,但这应该足以解释问题。

有没有人知道如何将布局与griddata相结合或有其他解决方案。 我想让第二列中的文本字段非常漂亮,而不是直接触摸它们。

这就是它的样子:

enter image description here

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

GridData必须应用于Text,而不是父亲。所以你必须“触摸”它们:

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

    new Label(shell, SWT.NONE).setText("name");
    Text name = new Text(shell, SWT.BORDER);
    name.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

    new Label(shell, SWT.NONE).setText("memory");
    Text memory = new Text(shell, SWT.BORDER);
    memory.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

    new Label(shell, SWT.NONE).setText("processors");
    Text processors = new Text(shell, SWT.BORDER);
    processors.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

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

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

看起来像这样:

enter image description here


<强>更新

好的,再考虑一下你的要求,并想出了另一个解决方案。在此解决方案中,您不必具有对实际Text对象的引用,但您将搜索它们:

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

    new Label(shell, SWT.NONE).setText("name");
    new Text(shell, SWT.BORDER);

    new Label(shell, SWT.NONE).setText("memory");
    new Text(shell, SWT.BORDER);

    new Label(shell, SWT.NONE).setText("processors");
    new Text(shell, SWT.BORDER);

    applyGridData(shell);

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

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

private static void applyGridData(Control parent)
{
    if(parent instanceof Text)
    {
        parent.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
    }
    else if(parent instanceof Composite)
    {
        Composite comp = (Composite) parent;

        for(Control control : comp.getChildren())
            applyGridData(control);
    }
}

基本上,此解决方案会递归搜索Composite Text个对象,然后将GridData应用于它们。