Выравнивание сетки SWT

#swt #grid-layout

Вопрос:

Когда все виджеты помещаются в один контейнер, сетка может нормально выровняться.
Но по какой-то причине мне нужно поместить некоторые виджеты в субконтейнер, такой как составной, как показано ниже. Выравнивание другое.

Итак, вопрос в следующем: существует ли контейнер, который не влияет на сетку?

Ps: Я знаю, что можно использовать пробелы в качестве обходного пути, но…

Код:

 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();
}
 

Результат:
Результат

Комментарии:

1. Нет, такого контейнера не существует. Вам действительно нужно придерживаться одного композита, если вы хотите, чтобы столбцы выстраивались в линию. Использование пробелов не является обходным путем — ширина пробела будет варьироваться в зависимости от шрифта, и будет невозможно заставить его работать на разных платформах.

2. Да, так что я не хочу использовать пробелы.

3. Возможно, вы могли бы использовать подсказку ширины сетки ( hint метод в GridDataFactory ), чтобы указать фиксированную ширину для всех меток, но работа со значением подсказки немного запутана.

Ответ №1:

Нет такого контейнера, который можно было бы использовать подобным образом. Прикрепление к одному композиту-это, безусловно, самый простой способ прикрепить этикетки.

Можно указать widthHint значение GridData для метки, чтобы указать ширину. Вам придется рассчитать требуемую ширину, используя что-то вроде:

 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);