У меня есть приложение Eclipse RCP, и я пытаюсь создать диалоговое окно, которое имеет очень большое поле (намного больше ширины диалогового окна без поля).
Общая идея состоит в том, чтобы иметь диалоговое окно, в котором основной корпус представляет собой композит с вертикальной прокруткой (за исключением поля, ширина не является проблемой), затем включите блок фиксированного размера (составной) с горизонтальной прокруткой. Напомним: диалог имеет вертикальный, внутри этого прокручиваемого композита есть еще один, только с горизонтальным.
Это не похоже на работу. Вот что я попробовал:
@Override
protected Control createContents(final Composite parent) {
dialogScrollArea = new ScrolledComposite(parent, SWT.V_SCROLL); // SWT.H_SCROLL |
GridLayoutFactory.fillDefaults().applyTo(dialogScrollArea);
GridDataFactory.fillDefaults().grab(true, true).applyTo(dialogScrollArea);
dialogScrollArea.setExpandHorizontal(true);
dialogScrollArea.setExpandVertical(true);
final Control content = super.createContents(dialogScrollArea); // creates view
dialogScrollArea.setContent(content);
dialogScrollArea.addControlListener(ControlListener.controlResizedAdapter(e -> {
System.err.print("Main Scroll: ");
Rectangle r = dialogScrollArea.getClientArea();
System.err.println(r.width);
}));
content.setSize(content.computeSize(SWT.DEFAULT, SWT.DEFAULT));
dialogScrollArea.setBackground(GUIHelper.COLOR_BLUE); // testing setExpandHorizontal
return dialogScrollArea;
}
/** {@inheritDoc} */
@Override
protected Control createContents(final Composite parent) {
...
initBottomArea(...);
return ...;
}
private void initBottomArea(final Composite parent) {
// Scroll 1
final ScrolledComposite scrolledComposite = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
GridLayoutFactory.fillDefaults().applyTo(scrolledComposite);
GridDataFactory.fillDefaults().grab(true, true).applyTo(scrolledComposite);
final Composite content = WidgetFactory.createComposite(scrolledComposite);
scrolledComposite.setContent(content); // TODO move at bot ?
GridLayoutFactory.fillDefaults().numColumns(40).applyTo(content);
GridDataFactory.fillDefaults().grab(true, true).applyTo(content);
for (int i = 0; i < 70; i++) {
ButtonFactory.createButton(content, "This is just a test").getWidget();
}
scrolledComposite.setExpandHorizontal(true);
scrolledComposite.setExpandVertical(true);
scrolledComposite.setMinSize(content.computeSize(SWT.DEFAULT, SWT.DEFAULT));
scrolledComposite.setAlwaysShowScrollBars(true);
// Scroll 2
Image image1 = Display.getDefault().getSystemImage(SWT.ICON_WORKING);
Image image2 = Display.getDefault().getSystemImage(SWT.ICON_QUESTION);
Image image3 = Display.getDefault().getSystemImage(SWT.ICON_ERROR);
final ScrolledComposite scrollComposite = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.BORDER);
final Composite content2 = new Composite(scrollComposite, SWT.NONE);
for(int i = 0; i <= 50; i++) {
Label label = new Label(content2, SWT.NONE);
if (i % 3 == 0) label.setImage(image1);
if (i % 3 == 1) label.setImage(image2);
if (i % 3 == 2) label.setImage(image3);
}
GridLayoutFactory.fillDefaults().numColumns(30).applyTo(content2);
scrollComposite.setContent(content2);
scrollComposite.setExpandVertical(true);
scrollComposite.setExpandHorizontal(true);
scrollComposite.setMinWidth(300);
scrollComposite.addControlListener(ControlListener.controlResizedAdapter(e -> {
System.err.print("Inner Scroll: ");
Rectangle r = scrollComposite.getClientArea();
System.err.println(r.width);
scrollComposite.setMinSize(content2.computeSize(r.width, SWT.DEFAULT));
}));
}
За исключением формы, открывающей диалог (я предполагаю .layout()
), сообщение слушателя внутренней прокрутки никогда не печатается, оно не регистрирует изменение размера. Внешняя прокрутка, с другой стороны, делает это всегда.
Я предполагаю, что, когда я устанавливаю композитный контент для области прокрутки, он больше не изменяется (фиксированная область) и что просто добавляет полосы прокрутки.
В этом случае это остается случаем, но не добавляет полосу прокрутки к основной прокрутке, но внутренняя прокрутка не уведомляется об изменении (фактически не происходило из его POV), и она не добавляется .
РЕДАКТИРОВАТЬ
После другого теста я добавил H_SCROLL в верхнюю прокрутку, и он вышел далеко за пределы экрана, потому что все кнопки, которые я делал, превышали экран, и кажется, что верхняя прокрутка «съела» дополнительное пространство (не отображается, обрезано - заметно; но дети не уведомлены об этом, почти как если бы она имела полосу прокрутки, но скрывала ее).
/ EDIT
Из того, что я понял, что я пытаюсь сделать, невозможно с реализацией SWT по умолчанию. Мне, вероятно, понадобится моя собственная обработка прокрутки. У нас есть сторонний компонент, который ведет себя точно так, как я хотел бы, но он делает то, что я сказал, он также имеет собственную обработку прокрутки, отключает и скрывает полосы прокрутки SWT.