Composite и ScrolledComposite занимают больше места, чем необходимо - PullRequest
0 голосов
/ 14 мая 2019

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

@Override
public void createPartControl(Composite parent) {
    if (this.parent == null) {
        this.parent = parent;
    }
    parent.setLayout(new GridLayout());
    SashForm mainComposite = new SashForm(parent, SWT.NONE);
    mainComposite.setLayout(new GridLayout());
    GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
    mainComposite.setLayoutData(gd);
//  createLeftSide(mainComposite);
    createRightSide(mainComposite);

//  mainComposite.setWeights(new int[] { 1, 4 });
}

Проблема возникает только в createRightSide:

private void createRightSide(Composite mainComposite) {
    ScrolledComposite detailsSC = new ScrolledComposite(mainComposite, SWT.SMOOTH | SWT.BORDER);
    GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
    detailsSC.setLayoutData(gd);
    detailsSC.setLayout(new GridLayout(1, true));

    Composite detailsComposite = new Composite(detailsSC, SWT.V_SCROLL);
    detailsComposite.setLayout(new GridLayout(2, false));
    detailsSC.setContent(detailsComposite);
    detailsSC.setExpandHorizontal(true);
    detailsSC.setExpandVertical(true);
    gd = new GridData(SWT.FILL, SWT.FILL, true, true);
    detailsSC.setLayoutData(gd);

    Label dmyLabel = new Label(detailsComposite, SWT.NONE);
    GridData labelData = new GridData();
    dmyLabel.setLayoutData(labelData);
    dmyLabel.setText("Dummy");

Когда я не использую SWT.FILL дляmainComposite субкомпозиты не заполняют пространство.detailsComposite.getVerticalBar().setEnabled(false); не имеет никакого эффекта, а detailsSC.getVerticalBar() возвращает ноль;Как я могу сказать композиту, чтобы он не занимал больше места, чем необходимо?

1 Ответ

1 голос
/ 14 мая 2019

Я не уверен, смог ли я воспроизвести ваш точный случай, но мне кажется, что полоса прокрутки появляется, потому что вы поставили стиль SWT.V_SCROLL на detailsComposite вместо ScrolledComposite (detailsSC).

Также:

  1. вы не устанавливаете данные макета на detailsComposite, а дважды на detailsSC
  2. вы не устанавливаете минимальный размерсодержимого для того, чтобы ScrolledComposite знал, когда показывать полосу прокрутки

Этот код должен работать:

private void createRightSide(Composite mainComposite) {
    ScrolledComposite detailsSC = new ScrolledComposite(mainComposite, SWT.SMOOTH | SWT.BORDER | SWT.V_SCROLL);
    GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
    detailsSC.setLayoutData(gd);
    detailsSC.setLayout(new GridLayout(1, true));
    detailsSC.setExpandHorizontal(true);
    detailsSC.setExpandVertical(true);

    Composite detailsComposite = new Composite(detailsSC, SWT.NONE);
    detailsComposite.setLayout(new GridLayout(2, false));
    GridData gdd = new GridData(SWT.FILL, SWT.FILL, true, true);
    detailsComposite.setLayoutData(gdd);

    Label dmyLabel = new Label(detailsComposite, SWT.NONE);
    GridData labelData = new GridData();
    dmyLabel.setLayoutData(labelData);
    dmyLabel.setText("Dummy");

    detailsSC.setContent(detailsComposite);       
    detailsSC.setMinSize(detailsComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...