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

Java 多个复合材料之间第一列的相等宽度,java,swt,Java,Swt,所以情况是,我有一个SWT复合物a,它聚集了复合物B和C。 B和C的内容由多行组成,多行由标签和文本组成。 在组合B或C中,行正确对齐(可以在标签边框结束和文本开始的位置绘制一条垂直直线)。但是如果你比较B和C,那么C内容看起来像是和B缩进的 例如: 有人知道如何实现它吗?我能想到的唯一对齐每个组合的第一列的方法是将GridData#widthHint设置为相同的值。该值必须是第一列中任何元素的最大宽度 我尝试了一下,提出了这个解决方案(它没有经过优化,因此可能不是最有效的方法): priva

所以情况是,我有一个SWT复合物a,它聚集了复合物B和C。 B和C的内容由多行组成,多行由标签和文本组成。 在组合B或C中,行正确对齐(可以在标签边框结束和文本开始的位置绘制一条垂直直线)。但是如果你比较B和C,那么C内容看起来像是和B缩进的

例如:


有人知道如何实现它吗?

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

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

private static Random Random=new Random(System.currentTimeMillis());
公共静态void main(字符串[]args)
{
显示=新显示();
外壳=新外壳(显示);
shell.setText(“StackOverflow”);
shell.setLayout(新的GridLayout(1,false));
复合材料优先=创建复合材料(外壳);
复合材料秒=创建复合材料(壳);
synchronizeFirstColumn(2,第一,第二);
shell.pack();
shell.open();
而(!shell.isDisposed())
{
如果(!display.readAndDispatch())
{
display.sleep();
}
}
display.dispose();
}
私有静态复合createComposite(Shell)
{
复合材料=新复合材料(壳体、SWT.边框);
组件设置布局(新网格布局(2,错误));
组件setLayoutData(新网格数据(SWT.FILL,SWT.FILL,true,true));
对于(int i=0;i<3;i++)
{
字符串内容=UUID.randomUUID().toString();
content=content.substring(0,Math.round(random.nextFloat()*content.length());
标签=新标签(组件,SWT.右侧);
label.setText(内容);
label.setLayoutData(新的GridData(SWT.END、SWT.TOP、false、false));
文本文本=新文本(组件、SWT.边框);
setLayoutData(新的GridData(SWT.FILL、SWT.TOP、true、false));
}
返回补偿;
}
专用静态无效同步EFirstColumn(int nrOfColumns、复合…comps)
{
if(comps==null | | comps.length==0)
返回;
int maxWidth=0;
用于(复合复合材料:复合材料)
{
Control[]controls=comp.getChildren();
对于(int i=0;i最大宽度)
最大宽度=宽度;
}
}
用于(复合复合材料:复合材料)
{
Control[]controls=comp.getChildren();
对于(int i=0;i
看起来像这样:


为什么不将a
GridLayout
用于B和C?它们必须分开吗?根据配置,有一种显示B或C或D或E(以及许多其他)的机制。如果我没有单独的组合,我将不得不迭代多个小部件并分别设置它们的可见性,这是我想要避免的。非常感谢。这就解决了我的问题。尽管如此,我还是必须在某个时候重构代码,而不是这样做,因为出现了这个问题,因为在过去,有人没有对设计考虑太多:/@Luke非常好,很高兴它作为一个临时解决方案起到了作用。祝重新设计好运。
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;
            }
        }
    }
}