Запретить 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));
}

... но зажимает последнюю кнопку: Запретить SWT ScrolledComposite съесть часть его детей

bigbrother82: Не сработало.

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

Привет, Джереми, я только сейчас заметил, что мое предложение не сработало. Тебе с этим повезло?

SCdF 29.09.2008 09:32

(кстати, если вы прокомментируете мой ответ, он появится в моих ответах, и я не пропущу его)

SCdF 29.09.2008 09:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
13
2
11 630
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

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

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

Ответ принят как подходящий

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

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

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