Как заставить полосы прокрутки работать в ScrolledComposite при использовании GridLayout?

Я пытаюсь получить прокручиваемый композит с содержимым фиксированного размера и меткой под прокручиваемой композитной информацией о состоянии отображения прокручиваемого контента. Поскольку я хочу, чтобы размеры элементов управления изменялись вместе с родителем, я использовал GridLayout для их родителя. Но я столкнулся с проблемой с полосами прокрутки прокручиваемой композиции и позиционированием элемента управления меткой. то есть прокрутка не работает, если я не устанавливаю атрибут данных сетки scrolledcomposite как

grabExcessVerticalspace = true

Если я позволю прокручиваемому композиту захватить лишнее вертикальное пространство, метка не появится под прокручиваемым композитом из-за пространства между ними.

public class Snippet5 {

  public static void main(String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new GridLayout(1, true));

    // this button is always 400 x 400. Scrollbars appear if the window is
    // resized to be too small to show part of the button
    ScrolledComposite c1 = new ScrolledComposite(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
    Button b1 = new Button(c1, SWT.PUSH);
    b1.setText("fixed size button");
    b1.setSize(400, 400);
    c1.setAlwaysShowScrollBars(true);
    c1.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true));
    c1.setContent(b1);

    Label l = new Label(shell, SWT.BORDER);
    l.setText("button clicked");
    GridData layoutData = new GridData(SWT.LEFT, SWT.TOP, true, false);
    layoutData.heightHint = 30;
    layoutData.widthHint  = 400;
    l.setLayoutData(layoutData);

    shell.setSize(600, 300);
    shell.open();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }
    display.dispose();
  }
}

Приветствуется любая помощь в том, чтобы метка отображалась точно под прокручиваемым составным элементом (обрезка пробела) и выполнялась прокрутка.

Изменить:

Ожидаемое поведение:

  1. Дополнительное вертикальное пространство, которое будет занято этикеткой.
  2. Scrolledcomposite должен включать вертикальную прокрутку, когда содержимое не может быть просмотрено полностью при изменении размера оболочки.

введите здесь описание изображения


person Monikka    schedule 13.09.2016    source источник


Ответы (1)


Вам нужно установить данные макета от ScrolledComposite до FILL следующим образом:

new GridData( SWT.FILL, SWT.FILL, true, true );

Таким образом, ScrolledComposite займет доступное пространство ячейки сетки.

person Rüdiger Herrmann    schedule 13.09.2016
comment
Это приводит к тому, что дополнительное пространство добавляется под прокручиваемым содержимым, а не отображается между прокручиваемым составным элементом и меткой, как раньше. Я хочу, чтобы прокручиваемый композит обертывал содержимое, за которым следовала метка, без дополнительного пространства между любыми элементами управления. Этого можно добиться, установив для функции grabExcessVerticalSpace значение FALSE, но тогда вертикальная прокрутка не работает. - person Monikka; 13.09.2016
comment
Пожалуйста, уточните свой вопрос: где должно быть дополнительное пространство? прокручиваемый композит не должен быть позже его содержимого? - person Rüdiger Herrmann; 13.09.2016
comment
Я хотел бы, чтобы метка захватила лишнее вертикальное пространство. т. е., вертикальное пространство scrolledcomposite = false. Но тогда прокрутка не работает. Поэтому я пытаюсь найти способ, чтобы прокрутка работала и не было пробелов между композитом и меткой. Я отредактировал вопрос, пожалуйста, дайте мне знать, если редактирование понятно. - person Monikka; 14.09.2016