Размещение компонентов и контейнеры 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. Эти классы названы
Каждый программист может создать собственные менеджеры размещения, реализовав интерфейсы LayoutManager или LayoutManager2.
Посмотрим, как размещают компоненты эти классы.
Менеджер
Наиболее просто поступает менеджер размещения FlowLayout. Он укладывает в контейнер один компонент за другим слева направо как кирпичи, переходя от верхних рядов к нижним. При изменении размера контейнера "кирпичи" перестраиваются, как показано
на рис. 14.1. Компоненты поступают в том порядке, в каком они заданы в методах
add().
В каждом ряду компоненты могут прижиматься к левому краю, если в конструкторе аргумент align равен FlowLayout.LEFT, к правому краю, если этот аргумент FlowLayout.RIGHT, или собираться в середине ряда, если FlowLayout.CENTER.
Между компонентами можно оставить
FlowLayout(int align, int hgap, int vgap);
Второй конструктор задает промежутки размером 5 пикселов:
FlowLayout(int align);
Третий конструктор определяет выравнивание по центру и промежутки 5 пикселов:
FlowLayout();
После формирования объекта эти параметры можно изменить методами:
setHgap(int hgap); setVgap(int vgap); setAlignment(int align);
В листинге 14.1 создаются кнопка JButton, метка JLabel, кнопка выбора JCheckBox, раскрывающийся список JComboBox, поле ввода JtextField и все это размещается в контейнере JFrame. Рисунок 14.1 содержит вид перечисленных компонентов при разных размерах контейнера.
import java.awt.*; import javax.swing.*;
class FlowTest extends JFrame{
FlowTest(String s){ super(s);
setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));
add(new JButton("Кнопка"));
add(new JLabel("Метка"));
add(new JCheckBox("Выбор"));
add(new JComboBox());
add(new JTextField("Ввод", 10));
setSize(300, 100);
setVisible(true);
}
public static void main(String[] args){
JFrame f= new FlowTest(" Менеджер FlowLayout"); f.setDefaultCloseOperation(EXIT ON CLOSE);
}
Рис. 14.1. Размещение компонентов с помощью FlowLayout |
Менеджер
Менеджер размещения BorderLayout делит контейнер на пять неравных областей, полностью заполняя каждую область одним компонентом, как показано на рис. 14.2. Области получили географические названия — north, south, west, east и center.
Метод add () в случае применения BorderLayout имеет два аргумента: ссылку на компонент comp и область region, в которую помещается компонент — одну из перечисленных ранее констант: add(Component comp, String region).
Обычный метод add (Component comp) с одним аргументом помещает компонент в область
CENTER.
Ссылку на компонент, помещенный в определенную область, можно получить методом
getLayoutComponent(Object region);
параметром которого служит одна из перечисленных ранее констант.
В классе два конструктора:
□ BorderLayout () — между областями нет промежутков;
□ BorderLayout (int hgap int vgap) - между областями остаются горизонтальные hgap и
вертикальные vgap промежутки, задаваемые в пикселах.
Если в контейнер помещается менее пяти компонентов, то некоторые области не используются и не занимают места в контейнере, как можно заметить на рис. 14.3. Если не занята область center, то компоненты прижимаются к границам контейнера.