ScrolledComposite внутри большего ScrolledComposite, не видит повторного размера - PullRequest
0 голосов
/ 14 января 2020

У меня есть приложение Eclipse RCP, и я пытаюсь создать диалоговое окно, которое имеет очень большое поле (намного больше ширины диалогового окна без поля).

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

Это не похоже на работу. Вот что я попробовал:

@Override
protected Control createContents(final Composite parent) {
    dialogScrollArea = new ScrolledComposite(parent, SWT.V_SCROLL); // SWT.H_SCROLL |
    GridLayoutFactory.fillDefaults().applyTo(dialogScrollArea);
    GridDataFactory.fillDefaults().grab(true, true).applyTo(dialogScrollArea);

    dialogScrollArea.setExpandHorizontal(true);
    dialogScrollArea.setExpandVertical(true);

    final Control content = super.createContents(dialogScrollArea); // creates view
    dialogScrollArea.setContent(content);
    dialogScrollArea.addControlListener(ControlListener.controlResizedAdapter(e -> {
        System.err.print("Main Scroll: ");
        Rectangle r = dialogScrollArea.getClientArea();
        System.err.println(r.width);
    }));

    content.setSize(content.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    dialogScrollArea.setBackground(GUIHelper.COLOR_BLUE); // testing setExpandHorizontal
    return dialogScrollArea;
}

/** {@inheritDoc} */
@Override
protected Control createContents(final Composite parent) {
    ...
    initBottomArea(...);

    return ...;
}

private void initBottomArea(final Composite parent) {
    // Scroll 1
    final ScrolledComposite scrolledComposite = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
    GridLayoutFactory.fillDefaults().applyTo(scrolledComposite);
    GridDataFactory.fillDefaults().grab(true, true).applyTo(scrolledComposite);

    final Composite content = WidgetFactory.createComposite(scrolledComposite);
    scrolledComposite.setContent(content); // TODO move at bot ?

    GridLayoutFactory.fillDefaults().numColumns(40).applyTo(content);
    GridDataFactory.fillDefaults().grab(true, true).applyTo(content);
    for (int i = 0; i < 70; i++) {
        ButtonFactory.createButton(content, "This is just a test").getWidget();
    }
    scrolledComposite.setExpandHorizontal(true);
    scrolledComposite.setExpandVertical(true);
    scrolledComposite.setMinSize(content.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    scrolledComposite.setAlwaysShowScrollBars(true);

    // Scroll 2
    Image image1 = Display.getDefault().getSystemImage(SWT.ICON_WORKING);
    Image image2 = Display.getDefault().getSystemImage(SWT.ICON_QUESTION);
    Image image3 = Display.getDefault().getSystemImage(SWT.ICON_ERROR);
    final ScrolledComposite scrollComposite = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.BORDER);

    final Composite content2 = new Composite(scrollComposite, SWT.NONE);
    for(int i = 0; i <= 50; i++) {
        Label label = new Label(content2, SWT.NONE);
        if (i % 3 == 0) label.setImage(image1);
        if (i % 3 == 1) label.setImage(image2);
        if (i % 3 == 2) label.setImage(image3);
    }
    GridLayoutFactory.fillDefaults().numColumns(30).applyTo(content2);

    scrollComposite.setContent(content2);
    scrollComposite.setExpandVertical(true);
    scrollComposite.setExpandHorizontal(true);
    scrollComposite.setMinWidth(300);
    scrollComposite.addControlListener(ControlListener.controlResizedAdapter(e -> {
        System.err.print("Inner Scroll: ");
        Rectangle r = scrollComposite.getClientArea();
        System.err.println(r.width);
        scrollComposite.setMinSize(content2.computeSize(r.width, SWT.DEFAULT));
    }));
}

За исключением формы, открывающей диалог (я предполагаю .layout()), сообщение слушателя внутренней прокрутки никогда не печатается, оно не регистрирует изменение размера. Внешняя прокрутка, с другой стороны, делает это всегда.

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

В этом случае это остается случаем, но не добавляет полосу прокрутки к основной прокрутке, но внутренняя прокрутка не уведомляется об изменении (фактически не происходило из его POV), и она не добавляется .

РЕДАКТИРОВАТЬ

После другого теста я добавил H_SCROLL в верхнюю прокрутку, и он вышел далеко за пределы экрана, потому что все кнопки, которые я делал, превышали экран, и кажется, что верхняя прокрутка «съела» дополнительное пространство (не отображается, обрезано - заметно; но дети не уведомлены об этом, почти как если бы она имела полосу прокрутки, но скрывала ее).

/ EDIT

Из того, что я понял, что я пытаюсь сделать, невозможно с реализацией SWT по умолчанию. Мне, вероятно, понадобится моя собственная обработка прокрутки. У нас есть сторонний компонент, который ведет себя точно так, как я хотел бы, но он делает то, что я сказал, он также имеет собственную обработку прокрутки, отключает и скрывает полосы прокрутки SWT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...