Размер просчитывается при динамическом добавлении JPanels - PullRequest
0 голосов
/ 14 августа 2010

Я пишу приложение, которое представляет собой виртуальный ноутбук. Идея состоит в том, чтобы панели с различным содержимым (основанным на внешнем файле) были добавлены в панель, которая действует как страница. Как только эта страница заполнится, ее специальный метод add должен вернуть false.

Проблема в том, что я не могу понять, как точно определить размер панелей, когда добавляю их, поэтому в итоге я добавляю слишком много. Предпочтительный размер панелей, как правило, слишком короткий, а размер имеет высоту 0. Есть ли способ определить точный размер, который компонент принимает в макете?

Я пытался использовать doLayout (), но, похоже, он не изменяет размер или предпочитаемый размер моих компонентов. Может я не правильно использую? Вот метод добавления: (ContentPanel имеет BoxLayout, а панель содержимого не имеет установленного размера, но добавляется к панели (этой), которая имеет. Класс, в котором этот метод расширяет JPanel)

public boolean addSpecializedgPanel(SpecializedPanel sp) {

    this.contentPanel.add(sp);

    this.doLayout();

    if (this.contentPanel.getSize().height > this.getHeight()) {
        this.contentPanel.remove(sp);
        return false;
    }

    return true;
}

Спасибо за любую помощь (даже если она критикует весь мой дизайн :))! Это была огромная головная боль!

Ответы [ 2 ]

1 голос
/ 14 августа 2010

Вы хотите использовать Container.validate () на панели (возможно, сначала вызову invalidate ()):

public void validate ()

Проверяет этот контейнер и всеего подкомпоненты.

Метод validate используется для того, чтобы контейнер снова планировал свои подкомпоненты.Он должен вызываться, когда подкомпоненты этого контейнера изменены (добавлены или удалены из контейнера, или изменена информация, связанная с макетом) после того, как контейнер был отображен.

Это должно привести к возникновению макета, иследовательно, изменение размеров компонентов.Затем вам нужно будет сделать недействительной () после удаления панели, на которой произошел сбой, перед возвратом false.

1 голос
/ 14 августа 2010

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

...