Как заполнить ScrolledComposite?

У меня есть класс, расширяющийся от ScrolledComposite, в этом классе я создал Composite, который предназначен для заполнения родительского ScrolledComposite. Но всякий раз, когда я добавляю метки к внутреннему композиту, он переносится только в правый верхний угол. Я хочу, чтобы мой внутренний Composite полностью заполнил внешний ScrolledComposite. Есть ли способ сделать это?

    public class Container extends ScrolledComposite {

    final Composite comp;
    Label nameLabel, sizeLabel, dateLabel;
    ArrayList<Label> entrySize, date;
    ArrayList<SimpleEntry> entry;
    Color white;
    Font font;

    public Container(Composite parent, int style) {
        super(parent, style);
        white = new Color(getDisplay(), 255, 255, 255);
        font = new Font(getDisplay(), "Arial", 16, SWT.BOLD);
        setBackground(white);
        setLayout(new GridLayout(1, false));

        comp = new Composite(this, SWT.BORDER);
        GridData compData = new GridData(SWT.FILL, SWT.FILL, true, true);
        comp.setLayoutData(compData);
        setContent(comp);
        comp.setBackground(white);
        comp.setLayout(new GridLayout(3, false));

        nameLabel = new Label(comp, SWT.BOLD);
        sizeLabel = new Label(comp, SWT.BOLD);
        dateLabel = new Label(comp, SWT.BOLD);

        GridData d1 = new GridData(SWT.CENTER, SWT.CENTER, true, false);
        nameLabel.setLayoutData(d1);

        GridData d2 = new GridData(SWT.CENTER, SWT.CENTER, true, false);
        sizeLabel.setLayoutData(d2);

        GridData d3 = new GridData(SWT.CENTER, SWT.CENTER, true, false);
        dateLabel.setLayoutData(d3);

        nameLabel.setBackground(white);
        sizeLabel.setBackground(white);
        dateLabel.setBackground(white);

        nameLabel.setText("Name");
        sizeLabel.setText("Size");
        dateLabel.setText("Last Modified");

        nameLabel.setFont(font);
        sizeLabel.setFont(font);
        dateLabel.setFont(font);

        comp.setSize(comp.computeSize(SWT.DEFAULT, SWT.DEFAULT));
        comp.layout();

        addDisposeListener(new DisposeListener() {
            @Override
            public void widgetDisposed(DisposeEvent e) {
                Container.this.widgetDisposed(e);
            }
        });
    }
}

person Anas    schedule 24.07.2013    source источник
comment
Я отредактировал это @Baz   -  person Anas    schedule 24.07.2013


Ответы (1)


Просто добавьте эти строки в конец конструктора:

this.setMinSize(comp.computeSize(SWT.DEFAULT, SWT.DEFAULT));
this.setExpandHorizontal(true);
this.setExpandVertical(true);

Заметки:

  • Не забудьте dispose() все ресурсы, которые вы создаете сами (Color, Font, ...)
  • Рассмотрите возможность использования системных ресурсов (не нужно удалять) с помощью display.getSystemColor(SWT.COLOR_WHITE) и display.getSystemFont().
person Baz    schedule 24.07.2013
comment
спасибо @Baz. Да, я разместил их в отдельной функции, здесь не показанной. - person Anas; 24.07.2013
comment
Я думал, что это произойдет, так как он заполнил родителя, но после заполнения данных я узнал, что родитель теперь не прокручивается:/ - person Anas; 24.07.2013
comment
@Anas Что произойдет, если вы снова установите минимальный размер после добавления своего контента? - person Baz; 24.07.2013
comment
да, теперь все работает нормально... Большое спасибо... Еще одна вещь. Нужно ли мне добавлять прослушиватель прокрутки, чтобы он прокручивал прокрутку мыши? Он начинает прокручиваться только тогда, когда я нажимаю элемент из данных. - person Anas; 24.07.2013
comment
@ Анас Тебе не следует этого делать. У меня работает нормально без Listener. - person Baz; 24.07.2013
comment
хм .. У меня тоже работает, но только после того, как я щелкну элемент из списка. Кроме того, он прокручивается слишком медленно. - person Anas; 24.07.2013
comment
@Anas Подумайте о том, чтобы сделать это новым вопросом, поскольку он относительно не связан с вашим первоначальным вопросом. - person Baz; 24.07.2013