2010-08-13 2 views
0

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

Проблема в том, что я не могу понять, как точно определить размер панелей, когда я их добавляю, поэтому я в итоге добавляю слишком много. Предпочтительный размер панелей обычно слишком короткий, а размер имеет 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; 
} 

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

+0

Я перефразировал свой вопрос таким образом, что (надеюсь) легче ответить и имеет полностью исполняемый образец кода! Проверьте это => http://stackoverflow.com/questions/3482379/return-actual-size-of-jcomponent-as-displayed – nova

ответ

1

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

+0

Jonas, я использую CardLayout для всех страниц, и это очень полезно для этого. Однако я не знаю, как это поможет. Это добавление небольших панелей на большую панель, которая выглядит как одна страница в виртуальном ноутбуке. Я не могу понять, как узнать, когда перестать добавлять компоненты, чтобы страница не была заполнена. – nova

+1

@StudentDesigner: Хорошо, но лучше не использовать JList или JTable. Тогда вам не нужно добавлять компоненты во время выполнения, что не рекомендуется. – Jonas

+0

Я предполагаю, что я мог бы использовать JList с настраиваемым визуализатором, но я не уверен, как это поможет? Жесткая часть заключается в том, что, поскольку информация о содержании SpecializedPanels поступает из внешнего источника (XML-файл), я ничего не знаю о них до времени исполнения. Я думаю, что я застрял, добавляя их таким образом, к сожалению. – nova

1

Вы хотите использовать Container.validate() на панели (возможно, призывающую недействительными() первый):

общественности недействительным Validate()

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

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

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

+0

Программное обеспечение Monkey, я попробовал ваше предложение, но используя printlns до и после, я не видел изменений в значениях, возвращаемых getSize() для добавляемой панели. Это заставляет меня задаться вопросом, почему валидат ничего не меняет ... – nova

+0

Фактически, после того, как весь ноутбук виден, от крышки до крышки размер специализированных панелей по-прежнему возвращает ноль! Как странно. Спасибо за ваше предложение --- Я раньше не знал о invalidate(). – nova

+0

@Stud: Убедитесь, что вы выполняете эту манипуляцию с графическим интерфейсом на EDT (Event Dispatch Thread); в противном случае все ставки отключены. –

Смежные вопросы