Запретить SWT ScrolledComposite съесть часть своих детей - PullRequest
12 голосов
/ 29 августа 2008

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

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

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: я попробовал ваше предложение, и теперь полосы прокрутки исчезли. Мне нужно еще немного поработать над этим.

Ответы [ 4 ]

12 голосов
/ 02 октября 2008

Это обычное препятствие при использовании 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);
}

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

2 голосов
/ 31 августа 2008

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

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();
}
0 голосов
/ 30 сентября 2008

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

0 голосов
/ 30 августа 2008

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

...