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