Eclipse SWT ScrolledComposite отказывается от прокрутки - PullRequest
0 голосов
/ 09 ноября 2019

Я разрабатываю плагин для Eclipse и пытаюсь использовать ScrolledComposite, а также заставить его занимать оставшееся пространство.

Родительский макет представляет собой сетку из 2 столбцов:

@Override
public void createPartControl(Composite parent) {
    parent.setLayout(new GridLayout(2, false));
    // other views etc
}

ScrolledComposite создается следующим образом (слегка сокращенно):

private void fillScroll() {
    if (scroll != null) {
      scroll.dispose();
    }
    scroll = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);

    GridData gd = new GridData();
    gd.horizontalSpan = 2;
    scroll.setLayoutData(gd);

    Composite innerContainer = new Composite(scroll, 0);
    innerContainer.setLayout(new GridLayout(1, false));

    // for loop that adds widgets to innerContainer

    scroll.setExpandHorizontal(true);
    scroll.setExpandVertical(true);
    scroll.setContent(innerContainer);
    scroll.setSize(innerContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT));

    parent.layout(true);
}

Picture of resulting layout

В список вопросов добавлены виджетыв цикле for и содержатся в innerContainer.

Ожидание: поскольку innerContainer слишком велик для родительского элемента, должны быть полосы прокрутки.

Что на самом деле происходит:полос прокрутки нет.

Как мне решить эту проблему?

1 Ответ

1 голос
/ 09 ноября 2019
  1. Для GridData на ScrolledComposite необходимо установить grabExcessVerticalSpace на true. Я предлагаю вам использовать расширенный конструктор, чтобы четко определить, как он должен отображаться, например:

    GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1);
    
  2. Вариант A: изменить scroll.setSize на scroll.setMinSize:

    scroll.setMinSize(innerContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    

    или, Вариант B: удалить scroll.setExpandHorizontal и scroll.setExpandVertical и изменить scroll.setSize на innerContainer.setSize:

    innerContainer.setSize(innerContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    
...