Размещение компонентов и контейнеры Swing
В предыдущих главах мы размещали компоненты главным образом "вручную", задавая их размеры и положение в контейнере абсолютными координатами в координатной системе контейнера. Для этого мы применяли метод setBounds ().
Такой способ размещает компоненты с точностью до пиксела, но не позволяет перемещать их. При изменении размеров окна с помощью мыши компоненты останутся на своих местах привязанными к левому верхнему углу контейнера. Кроме того, нет гарантии, что все мониторы отобразят компоненты так, как вы задумали.
Чтобы учесть изменение размеров окна, надо задать размеры и положение компонента относительно размеров контейнера, например, так:
int w = getSize().width; // Получаем ширину
int h = getSize().height; // и высоту контейнера.
Button b = new Button("OK"); // Создаем кнопку.
b.setBounds(9*w/20, 4*h/5, w/10, h/10);
и при всяком изменении размеров окна задавать расположение компонента заново.
Чтобы избавить программиста от этой кропотливой работы, в библиотеку AWT внесены два интерфейса: LayoutManager и порожденный от него интерфейс LayoutManager2, а также пять реализаций этих интерфейсов: классы BorlerLayout, CardLayout, FlowLayout, GridLayout и GridBagLayout. Эти классы названы менеджерами размещения (layout manager) компонентов. Мы уже использовали некоторые из них в предыдущих главах без всякого объяснения. Библиотека Swing добавляет к указанным классам свои менеджеры размещения, используемые контейнерами Swing.
Каждый программист может создать собственные менеджеры размещения, реализовав интерфейсы LayoutManager или LayoutManager2.
Посмотрим, как размещают компоненты эти классы.