Подтвердить что ты не робот

Предотвратите использование SWT ScrolledComposite от его части

Что я сделал не так?

Вот отрывок из моего кода:

public void createPartControl(Composite parent) {
  parent.setLayout(new FillLayout());
  ScrolledComposite scrollBox = new ScrolledComposite(parent, SWT.V_SCROLL);
  scrollBox.setExpandHorizontal(true);
  mParent = new Composite(scrollBox, SWT.NONE);
  scrollBox.setContent(mParent);
  FormLayout layout = new FormLayout();
  mParent.setLayout(layout);
  // Adds a bunch of controls here
  mParent.layout();
  mParent.setSize(mParent.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));
}

... но он зажимает последнюю кнопку: alt text

bigbrother82: Это не сработало.

SCdF: Я попробовал ваше предложение, и теперь полосы прокрутки исчезли. Мне нужно еще поработать над этим.

4b9b3361

Ответ 1

Это обычное препятствие при использовании ScrolledComposite. Когда он становится настолько малым, что полоса прокрутки должна отображаться, клиентское управление должно сокращаться горизонтально, чтобы освободить место для полосы прокрутки. Это имеет побочный эффект, заключающийся в том, что некоторые метки обертывают линии, которые перемещают следующие элементы управления дальше, что увеличивает минимальную высоту, необходимую для композитного содержимого.

Вам нужно прослушивать изменения ширины композитного контента (mParent), снова вычислить минимальную высоту с учетом новой ширины содержимого и вызвать setMinHeight() на прокручиваемом композите с новой высотой.

public void createPartControl(Composite parent) {
  parent.setLayout(new FillLayout());
  ScrolledComposite scrollBox = new ScrolledComposite(parent, SWT.V_SCROLL);
  scrollBox.setExpandHorizontal(true);
  scrollBox.setExpandVertical(true);

  // Using 0 here ensures the horizontal scroll bar will never appear.  If
  // you want the horizontal bar to appear at some threshold (say 100
  // pixels) then send that value instead.
  scrollBox.setMinWidth(0);

  mParent = new Composite(scrollBox, SWT.NONE);

  FormLayout layout = new FormLayout();
  mParent.setLayout(layout);

  // Adds a bunch of controls here

  mParent.addListener(SWT.Resize, new Listener() {
    int width = -1;
    public void handleEvent(Event e) {
      int newWidth = mParent.getSize().x;
      if (newWidth != width) {
        scrollBox.setMinHeight(mParent.computeSize(newWidth, SWT.DEFAULT).y);
        width = newWidth;
      }
    }
  }

  // Wait until here to set content pane.  This way the resize listener will
  // fire when the scrolled composite first resizes mParent, which in turn
  // computes the minimum height and calls setMinHeight()
  scrollBox.setContent(mParent);
}

При прослушивании изменений размера обратите внимание, что мы игнорируем любые события изменения размера, где ширина остается неизменной. Это связано с тем, что изменения в высоте содержимого не влияют на высоту содержимого minimum, если ширина одинаковая.

Ответ 2

Если я не ошибаюсь, вам нужно поменять

mParent.layout();

и

mParent.setSize(mParent.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));

чтобы у вас было:

public void createPartControl(Composite parent) {
  parent.setLayout(new FillLayout());
  ScrolledComposite scrollBox = new ScrolledComposite(parent, SWT.V_SCROLL);
  scrollBox.setExpandHorizontal(true);
  mParent = new Composite(scrollBox, SWT.NONE);
  scrollBox.setContent(mParent);
  FormLayout layout = new FormLayout();
  mParent.setLayout(layout);
  // Adds a bunch of controls here
  mParent.setSize(mParent.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));
  mParent.layout();
}

Ответ 3

Вам не нужно пересчитывать размер scrollBox после макета?

Ответ 4

Попробуйте установить .setMinWidth и .setMinHeight на ScrolledComposite после того, как макет будет выполнен, передав его размер основного композита.