SWT 网格布局对齐

SWT gridlayout align

将所有小部件放在一个容器中时,网格布局可以正常对齐。
但出于某种原因,我需要将一些小部件放入子容器中,例如下面的复合材料。对齐方式不同

那么问题来了:有没有对gridlayout没有影响的容器?
Ps:我知道可以使用白色 space 作为解决方法,但是...

代码:

public static void main(String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);
    
    GridLayoutFactory.fillDefaults().numColumns(2).margins(8, 3).applyTo(shell);
    
    new Label(shell, 0).setText("Label1");
    new Text(shell, 0);
    
    new Label(shell, 0).setText("A long Label");
    new Text(shell, 0);
    
    Composite composite = new Composite(shell, 0);
    GridDataFactory.fillDefaults().span(2, 1).applyTo(composite);
    GridLayoutFactory.fillDefaults().numColumns(2).applyTo(composite);

    new Label(composite, 0).setText("Label22");
    new Text(composite, 0);
    
    new Label(composite, 0).setText("Label223");
    new Text(composite, 0);
    
    shell.open();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
}

结果:

没有可以这样使用的容器。坚持使用单一复合材料是迄今为止对齐标签的最简单方法。

可以指定标签的widthHintGridData来指定宽度。您必须使用类似以下内容来计算所需的宽度:

List<Control> labels = ... list of Label controls 

final int width = labels.stream()
   .mapToInt(label -> label.computeSize(SWT.DEFAULT, SWT.DEFAULT).x)
   .max()
   .getAsInt();

final var labelData = GridDataFactory.swtDefaults().hint(width, SWT.DEFAULT);

labels.forEach(labelData::applyTo);