Т.Л., др Есть хороший способ, чтобы скрыть столбец в GridLayout
, а также скрыть остальные интервалы между столбцами на материнской Composite
?Скрыть столбец GridLayout и расстояние между ними остальными столбцами
У меня есть композит с несколькими колонками в GridLayout
. Один столбец - это Composite
с StackLayout
, так что, если у вас есть какие-то действия, я могу скрыть/показать, что Composite
.
Чтобы сделать скрытие/показ я установка атрибута exclude
на GridData
и атрибут topControl
на StackLayout
:
// To hide
stackLayout.topControl = null;
stackComposite.setVisible(false);
((GridData) stackComposite.getLayoutData()).exclude = true;
Теперь, когда я скрываю в середине Composite
, я вижу, что дополнительное пространство появляется в дальнем конце строки.
Это возможно потому, что GridLayout
на базе Composite
все еще имеет одинаковое число столбцов, так что мы видим столбец с толщиной 0, и указанный интервал колонке с обеих сторон.
Чтобы исправить это я придумал несколько (не идеальными) решений:
Декремента/увеличивает количество столбцов скрытия/показ.
Вместо того, чтобы использовать атрибут
exclude
, мы переопределитьComposite
сStackLayout
и изменитьcomputeSize(...)
функции либо возвращать 0, или вычислить реальный размер в зависимости от того, хотим ли мы, чтобы появиться или нет. (Это, безусловно, мой нелюбимый вариант, и я чувствую себя плохо, даже писать это)Установите
horizontalSpacing
на базеComposite
0, а вместо этого используя интервал внутри каждого столбцаComposite
диктовать интервал. Это будет выглядеть так, когда скрытое:
Вариант 1 был наиболее заманчивыми до сих пор, однако есть более ясный недостаток здесь при попытке сохранить модульность кода. Например, если Composite
для каждого столбца настроен каким-то многократно используемым компонентом, декремент/увеличение количества столбцов зависит от этого компонента, зная, что его родительский Composite
имеет GridLayout
- это не безопасное предположение!
Вариант 2 I flat-out не нравится.
Вариант 3 не является ужасным, однако он по-прежнему ощущается как неправильное использование интервалов и полей.Плюс к тому, чтобы вернуться к точке модульности, другие компоненты столбца будут отвечать за промежуток, который влияет на более крупный вид, вместо того, чтобы позволить большему виду диктовать интервал.
Так что мой вопрос сводится к: есть ли другой вариант, который лучше, чем эти три?
MCVE используется для получения изображения выше:
public class MCVE {
final Display display;
final Shell shell;
public MCVE() {
display = new Display();
shell = new Shell(display);
shell.setLayout(new GridLayout());
shell.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
final Composite baseComposite = new Composite(shell, SWT.NONE);
baseComposite.setLayout(new GridLayout(3, false));
baseComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
baseComposite.setBackground(new Color(display, new RGB(125, 125, 255)));
final Composite contentComposite1 = new Composite(baseComposite, SWT.NONE);
contentComposite1.setLayout(new GridLayout());
contentComposite1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
final Label contentLabel1 = new Label(contentComposite1, SWT.NONE);
contentLabel1.setText("I stretch to fill available space!");
final Composite stackComposite = new Composite(baseComposite, SWT.NONE);
final StackLayout stackLayout = new StackLayout();
stackComposite.setLayout(stackLayout);
stackComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
final Composite stackContentComposite = new Composite(stackComposite, SWT.NONE);
stackContentComposite.setLayout(new GridLayout());
stackContentComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
final Label stackContentLabel = new Label(stackContentComposite, SWT.NONE);
stackContentLabel.setText("I can disappear and reappear!");
stackLayout.topControl = stackContentComposite;
final Composite contentComposite3 = new Composite(baseComposite, SWT.NONE);
contentComposite3.setLayout(new GridLayout());
contentComposite3.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));
final Label contentLabel3 = new Label(contentComposite3, SWT.NONE);
contentLabel3.setText("I live on the end :(");
final Button flipButton = new Button(shell, SWT.PUSH);
flipButton.setText("Flip");
flipButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
if (stackLayout.topControl == null) {
stackLayout.topControl = stackContentComposite;
((GridData) stackComposite.getLayoutData()).exclude = false;
// ((GridLayout) baseComposite.getLayout()).numColumns++;
stackComposite.setVisible(true);
baseComposite.layout(true, true);
} else {
stackLayout.topControl = null;
((GridData) stackComposite.getLayoutData()).exclude = true;
// ((GridLayout) baseComposite.getLayout()).numColumns--;
stackComposite.setVisible(false);
baseComposite.layout(true, true);
}
}
});
}
public void run() {
shell.setSize(600, 115);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
public static void main(final String... args) {
new MCVE().run();
}
}
Хорошие баллы - я не думал явно проверять код Eclipse, как это обрабатывается (быстрый поиск показал это ['ViewSettingsDialog'] (http://www.javadocexamples.com/java_source/org/eclipse/ ui/preferences/ViewSettingsDialog.java.html), который делает что-то очень похожее). Спасибо за напоминание о взаимоотношениях с родителем там тоже, что смутило меня в течение самого долгого времени :) – avojak