Не позволяйте 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));
}
... но он зажимает последнюю кнопку:
старший брат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 после того, как макет будет выполнен, передав ему размер основного композита.