Eclipse rcp layout проблема - PullRequest
       30

Eclipse rcp layout проблема

0 голосов
/ 05 марта 2012

У меня проблема с редактором и его содержимым. Его следующее: есть редактор с функцией предварительного просмотра печати, основную часть редактора занимает скрепка компонента PrintPreview, с левой стороны - композит с несколькими кнопками (см. Скриншот 1).

screenshot 1

Как видите, PrintPreview находится внутри ScrolledComposite.

Проблема в том, что при изменении размера окна или представлений в редакторе нижняя полоса прокрутки перемещается под представлениями и, таким образом, исчезает. После этого невозможно прокрутить по горизонтали (полоса прокрутки редактора не отображается). смотрите скриншот 2 (нижняя полоса прокрутки становится скрытой).

Оно начинает скрываться, когда высота редактора меньше высоты правого композита (под последней кнопкой есть больше виджетов, я только что их стер)

screenshot 2

Если я сжимаю окно, то правый композит никогда не теряет своей ширины и всегда виден (см. Скриншот 3 - он не позволяет изменять размеры больше этого).

screenshot 3 Композиты создаются следующим образом:

   @Override
    public void createPartControl(final Composite parent) {

        GridLayout gridLayout = new GridLayout(2, false);
        parent.setLayout(gridLayout);

        // Scroll area for the print area
        scroll = new ScrolledComposite(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        final GridData gridData = new GridData(GridData.FILL_BOTH);
        gridData.grabExcessHorizontalSpace = true;
        gridData.grabExcessVerticalSpace = true;
        gridData.widthHint = 1;
        gridData.heightHint = 1;
        scroll.setLayoutData(gridData);
        scroll.setExpandHorizontal(true);
        scroll.setExpandVertical(true);

// Button area
        final Composite buttonArea = new Composite(parent, SWT.FLAT);
        final GridData layoutData = new GridData(SWT.FILL, SWT.TOP, false, false);
        buttonArea.setLayoutData(layoutData);
        gridLayout = new GridLayout(1, false);
        buttonArea.setLayout(gridLayout);

Вопрос: как не предотвратить исчезновение нижней полосы прокрутки? Могу ли я вести себя так же, как ширина и ширина правильного композита - невозможно изменить размер меньше, чем правильная композитная высота? Или как я могу показать полосу прокрутки во всем редакторе, если превышен минимальный предел высоты?

Я пробовал разные вещи на разных композитах, например, устанавливал наименьшую высоту и высоту подсказки, помещал кнопки прокрутки в прокручиваемый композит (просто для удовольствия) и т. Д. Но мне ничего не помогло.

Кто-нибудь знает быстрое решение? Спасибо.

1 Ответ

2 голосов
/ 06 марта 2012

См. Этот пост SO: Запретить SWT scrolledComposite съесть часть своих детей

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

Если приведенный выше пост не так полезен, как кажется, то поделитесь некоторым минимальным компилируемым и исполняемым кодом дляповторить проблему.Также упомяните версию eclipse / swt, версию ОС и JDK, это поможет проанализировать проблему.

Демонстрационный код для события изменения размера и вывода !!

Код:

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;

public class ScrolledCompositeTest
{
    public static void main (String [] args)
    {
          Display display = new Display ();
          Shell shell = new Shell (display);
          shell.setLayout(new FillLayout());

          GridLayout layout = new GridLayout();
          layout.numColumns = 4;

          // set the minimum width and height of the scrolled content - method 2
          final ScrolledComposite sc2 = new ScrolledComposite(shell, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
          sc2.setExpandHorizontal(true);
          sc2.setExpandVertical(true);
          final Composite c2 = new Composite(sc2, SWT.NONE);
          sc2.setContent(c2);
          layout = new GridLayout();
          layout.numColumns = 7;
          c2.setLayout(layout);
          Button b2 = new Button (c2, SWT.PUSH);
          b2.setText("first button");
          sc2.setMinSize(c2.computeSize(SWT.DEFAULT, SWT.DEFAULT));

          Button add = new Button (shell, SWT.PUSH);
          add.setText("add children");
          final int[] index = new int[]{0};
          add.addListener(SWT.Selection, new Listener() {
              public void handleEvent(Event e) {
                  index[0]++;
                  Button button = new Button(c2, SWT.PUSH);
                  button.setText("button "+index[0]);
                  sc2.setMinSize(c2.computeSize(SWT.DEFAULT, SWT.DEFAULT));
                  c2.layout();
              }
          });

          shell.open ();
          while (!shell.isDisposed ()) {
              if (!display.readAndDispatch ()) display.sleep ();
          }
          display.dispose ();
     }
}

Выход:

Actual Size

enter image description here

Vertical Resize

enter image description here

Horizontal Resize

enter image description here

...