<p><strong>Размещение компонентов и контейнеры Swing</strong></p>

В предыдущих главах мы размещали компоненты главным образом "вручную", задавая их размеры и положение в контейнере абсолютными координатами в координатной системе контейнера. Для этого мы применяли метод 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.

Посмотрим, как размещают компоненты эти классы.

<p><strong>Менеджер <emphasis>FlowLayout</emphasis></strong></p>

Наиболее просто поступает менеджер размещения FlowLayout. Он укладывает в контейнер один компонент за другим слева направо как кирпичи, переходя от верхних рядов к нижним. При изменении размера контейнера "кирпичи" перестраиваются, как показано

на рис. 14.1. Компоненты поступают в том порядке, в каком они заданы в методах

add().

В каждом ряду компоненты могут прижиматься к левому краю, если в конструкторе аргумент align равен FlowLayout.LEFT, к правому краю, если этот аргумент FlowLayout.RIGHT, или собираться в середине ряда, если FlowLayout.CENTER.

Между компонентами можно оставить промежутки (gap) по горизонтали hgap и вертикали vgap. Это задается в конструкторе:

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 содержит вид перечисленных компонентов при разных размерах контейнера.

Листинг 14.1. Менеджер размещения FlowLayout

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
<p><strong>Менеджер <emphasis>BorderLayout</emphasis></strong></p>

Менеджер размещения 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, то компоненты прижимаются к границам контейнера.

Перейти на страницу:

Все книги серии В подлиннике

Похожие книги