Как сделать представление прокручиваемым в приложении Eclipse RCP?

Что я пробовал до сих пор:

В createPartControl:

ScrolledComposite sc = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL);
        sc.setLayoutData(new GridData(GridData.FILL_BOTH));
        sc.setExpandVertical(true);
        sc.setExpandHorizontal(true);
        sc.setSize(ApplicationWorkbenchWindowAdvisor.WIDTH, ApplicationWorkbenchWindowAdvisor.HEIGHT);
        final TabFolder tabFolder = new TabFolder(sc, SWT.TOP);

но это не работает. Моя проблема в том, что если я изменяю размер окна программы, полосы прокрутки не отображаются в моем представлении. Любые идеи?


person Adam Arold    schedule 17.10.2011    source источник


Ответы (3)


Javadoc of ScrolledComposite описывает два способа его использования, включая пример кода. Подводя итог:

  1. Вы либо устанавливаете размер элемента управления/композита, содержащегося в вашем ScrolledComposite, на самом элементе управления/композите
  2. Или вы указываете своему ScrolledComposite минимальный размер для его содержимого.

В настоящее время вы не делаете ни того, ни другого. Вы устанавливаете размер на ScrolledComposite, но если вы не используете менеджер компоновки, это не имеет особого смысла. В любом случае, смотрите приведенную выше ссылку для официального примера кода.

person p12t    schedule 17.10.2011
comment
Большое спасибо! Теперь я научился ВСЕГДА проверять javadoc, прежде чем задавать глупые вопросы... - person Adam Arold; 17.10.2011

Как правило, в представлениях Eclipse я хочу, чтобы мои элементы управления занимали все доступное пространство и отображали только полосы прокрутки, если в противном случае элемент управления уменьшился бы до размера, пригодного для использования.

Другие ответы совершенно верны, но я хотел добавить полный пример метода createPartControl (Eclipse e4).

@PostConstruct
public void createPartControl(Composite parent) {
    ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
    Composite composite = new Composite(sc, SWT.NONE);
    sc.setContent(composite);

    composite.setLayout(new GridLayout(2, false));

    Label label = new Label(composite, SWT.NONE);
    label.setText("Foo");

    Text text = new Text(composite, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI);
    GridDataFactory.fillDefaults().grab(true, true).hint(400, 400).applyTo(text);

    sc.setExpandHorizontal(true);
    sc.setExpandVertical(true);
    sc.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
}

Обратите внимание, что .fillDefaults() подразумевает .align(SWT.FILL, SWT.FILL).

Я обычно использую этот шаблон, поэтому я создал следующий небольшой вспомогательный метод:

public static ScrolledComposite createScrollable(Composite parent, Consumer<Composite> scrollableContentCreator) {
    ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
    Composite composite = new Composite(sc, SWT.NONE);
    sc.setContent(composite);

    scrollableContentCreator.accept(composite);

    sc.setExpandHorizontal(true);
    sc.setExpandVertical(true);
    sc.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    return sc;
}

Благодаря лямбда-выражениям Java 8 теперь вы можете очень компактно реализовывать новые прокручиваемые композиты:

    createScrollable(container, composite -> {
        composite.setLayout(new FillLayout());
        // fill composite with controls
    });
person Max Hohenegger    schedule 11.07.2014
comment
Я получаю тот же результат с вызовом setMinSize или без него, что кажется странным... Полосы прокрутки появляются, когда мой редактор становится меньше подсказки размера в GridData в любом случае. Возможно, это связано с тем, что это многостраничный редактор форм... - person Lii; 15.09.2017

Это небольшой фрагмент кода, который работал у меня:

    ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
    Composite composite = new Composite(sc, SWT.NONE);
    sc.setContent(composite);

    Label lblRelation = new Label(composite, SWT.NONE);
    lblRelation.setBounds(10, 13, 74, 15);
    lblRelation.setText("Label name:");
    composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
person sudipn    schedule 12.09.2013