Все компоненты, которые мы показывали до сих пор, были размещены (позиционированы) в контейнере менеджером компоновки, заданным по умолчанию. Как мы упомянули в начале этой главы, менеджер компоновки автоматически размещает элементы управления в пределах окна, используя некоторый тип алгоритма. Если вы программировали для других GUI-сред, таких как Windows, то привыкли к размещению элементов управления вручную. Хотя элементы управления Java тоже можно размещать вручную, в этом нет необходимости по двум причинам. Во-первых, очень утомительно вручную размещать большое количество компонентов. Во-вторых, иногда, в тот момент, когда нужно размещать некоторый элемент, информация о его размерах оказывается недоступной (чаще всего потому, что необходимые для получения этой информации компоненты комплекта инструментов еще не были реализованы). Правильное же размещение компонента без определенных размеров относительно других компонентов весьма проблематично. Поэтому разработаны специальные программные компоненты (менеджеры компоновки) для автоматического управления компоновкой.
Каждый объект типа Container имеет связанный с ним менеджер компоновки. Менеджер компоновки — это экземпляр некоторого класса, который реализует интерфейс LayoutManager. Менеджер компоновки устанавливается методом setLayout(). Если вызов setLayout() не сделан, то используется менеджер компоновки по умолчанию (поточный). Менеджер компоновки применяется всякий раз, когда контейнер изменяется в размерах (или устанавливается впервые — с первоначальными размерами), чтобы позиционировать каждый из его внутренних компонентов.
Метод SetLayout() имеет следующую общую форму:
void setLayout (LayoutManager layoutObj)
Здесь layoutObj — ссылка на необходимый менеджер компоновки. Если вы хотите отключить менеджер компоновки и позиционировать компоненты вручную, передавайте в качестве параметра layoutObj значение null (пустой указатель). Если вы это сделаете, то будете вынуждены определять форму и позицию каждого компонента вручную, указывая метод setBounds(), определенный в Component. Но, как правило, следует использовать менеджер компоновки.
Каждый менеджер компоновки хранит и отслеживает список имен компонентов. Всякий раз, когда вы добавляете компонент в контейнер, менеджер компоновки получает соответствующее уведомление. Если нужно изменять размеры контейнера, менеджер компоновки консультируется со своими vетодами minimumLayoutSize() и preferredLayoutSize(). Каждый компонент, который управляется менеджером компоновки, содержит методы getPreferredSize() и getMinimumSize(). Они возвращают предпочтительный и минимальный размер, требуемый для отображения каждого компонента. Если это вообще возможно, менеджер компоновки будет удовлетворять эти запросы (для поддержки целостности политики компоновки). Для элементов управления своего подкласса можно переопределить указанные методы. Иначе используются значения по умолчанию.
Java имеет несколько предопределенных классов LayoutManager, которые описываются ниже. Используйте тот менеджер компоновки, который наилучшим образом подходит вашему приложению.