多个复合材料之间第一列的宽度相等

时间:2014-08-26 09:24:45

标签: java swt

所以情况是我有一个SWT复合材料A聚合复合材料B和C. B和C的内容由多行组成,包括Label和Text。 在复合B或C行内正确对齐(您可以在标签边框结束和文本开始的位置绘制直线垂直线)。但是如果你比较B和C,那么C内容看起来就像是缩进B。

例如:

enter image description here

有没有人知道如何实现它?

1 个答案:

答案 0 :(得分:2)

我能想到的唯一方法是对齐每个Composite的第一列,就是将GridData#widthHint设置为相同的值。该值必须是第一列中任何元素的最大宽度。

我试了一下并提出了这个解决方案(它没有经过优化,因此可能不是最有效的方法):

private static Random random = new Random(System.currentTimeMillis());

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

    Composite first = createComposite(shell);
    Composite second = createComposite(shell);

    synchronizeFirstColumn(2, first, second);

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

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

private static Composite createComposite(Shell shell)
{
    Composite comp = new Composite(shell, SWT.BORDER);

    comp.setLayout(new GridLayout(2, false));
    comp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

    for (int i = 0; i < 3; i++)
    {
        String content = UUID.randomUUID().toString();
        content = content.substring(0, Math.round(random.nextFloat() * content.length()));

        Label label = new Label(comp, SWT.RIGHT);
        label.setText(content);
        label.setLayoutData(new GridData(SWT.END, SWT.TOP, false, false));

        Text text = new Text(comp, SWT.BORDER);
        text.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
    }

    return comp;
}

private static void synchronizeFirstColumn(int nrOfColumns, Composite... comps)
{
    if (comps == null || comps.length == 0)
        return;

    int maxWidth = 0;

    for (Composite comp : comps)
    {
        Control[] controls = comp.getChildren();

        for (int i = 0; i < controls.length; i += nrOfColumns)
        {
            int width = controls[i].computeSize(SWT.DEFAULT, SWT.DEFAULT).x;

            if (width > maxWidth)
                maxWidth = width;
        }
    }


    for (Composite comp : comps)
    {
        Control[] controls = comp.getChildren();

        for (int i = 0; i < controls.length; i += nrOfColumns)
        {
            Object data = controls[i].getLayoutData();

            if(data instanceof GridData)
            {
                GridData grid = (GridData) data;

                grid.widthHint = maxWidth;
            }
        }
    }
}

看起来像这样:

enter image description here