Не позволяйте SWT ScrolledComposite съедать часть своих дочерних элементов

StackOverflow https://stackoverflow.com/questions/35123

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

старший брат82:Это не сработало.

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

Это было полезно?

Решение

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

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

Другие советы

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

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();
}

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top