Приложение 4. Менеджеры размещения.



 

Для того чтобы размещение компонентов в окне не нарушалось при движении, переносе и т.д. используются менеджеры размещения или компоновки (layout managers), называемые иногда просто компоновщиками.

Программист может воспользоваться стандартными менеджерами размещения или написать свои собственные, реализовав интерфейсы LayoutManager или LayoutManager2. К стандартным менеджерам размещения относятся:

 

Класс Описание
null абсолютное позиционирование при размещении компонентов в контейнере
FlowLayout компоненты размещаются в контейнере один за другим: слева направо, сверху вниз
BorderLayout компоненты размещаются в контейнере в порядке сторон света – “Север”, “Восток”, “Юг”, “Запад”, “Центр”
GridLayout компоненты размещаются в контейнере в клетках таблицы; каждый элемент занимает одну клетку
GridBagLayout компоненты размещаются в контейнере в клетках таблицы; каждый элемент может занимать более одной клетки; является наиболее гибким компоновщиком
CardLayout одновременно доступен один компонент контейнера; идеальный менеджер компоновки для создания составных компонентов, похожих на “записные” книжки в Windows

 

Менеджеры размещения могут быть скомбинированы друг с другом.

По умолчанию в панелях и аплетах используется менеджер размещения FlowLayout, а в окнах и диалоговых окнах – BorderLayout.

Установка менеджера размещения для текущего контейнера осуществляется при помощи вызова:

контейнер.setLayout(new конструкторМенеджераРазмещения(параметры))

Менеджер абсолютного размещения

Объявление того, что контейнер имеет менеджер размещения с абсолютным позиционированием компонентов, имеет вид:

контейнер.setLayout(null)

Установка границ каждого компонента осуществляется при помощи метода:

компонент.setSize(координатаХ, координатаY, ширина, высота)

Компонент добавляется в контейнер при помощи метода:

контейнер.add(компонент)

 

Приведем пример использования менеджера размещения компонентов с абсолютным позиционированием.

Пример.1. Демонстрация использования менеджера размещения компонентов с абсолютным позиционированием

import java.awt.*;

public class Absolute extends Frame{

 

Button b1 = new Button("Cancel"),// Создадим две кнопки

b2 = new Button("OK" );

 

public void Absolute()

{

setBackground(Color.lightGray); // Установим светло-серый фон

 

setLayout(null);// Установим для окна менеджер абсолютного расположения

 

// Установим границы (расположение и размеры) для каждой кнопки

b1.setBounds( 50, 70, 50, 24);

b2.setBounds(110, 70, 50, 24);

 

// Добавим обе кнопки в окно

add(b1);

add(b2);

}

}

 

Менеджер FlowLayout

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

Менеджер BorderLayout

Менеджер размещения BorderLayout делит контейнер на пять неравных областей, полностью заполняя каждую область одним компонентом. Области получили географические названия NORTH, SOUTH, WEST, EAST и CENTER.

Метод add() в случае применения BorderLayout имеет два аргумента: ссылку на компонент comp и область region, в которую помещается компонент — одну из перечисленных выше констант:

add(Component comp, String region)

Обычный метод add (Component comp) с одним аргументом помещает компонент в область CENTER.

В классе два конструктора:

· BorderLayout () — между областями нет промежутков;

· BorderLayout(int hgap int vgap) — между областями остаются горизонтальные hgap и вертикальные vgap промежутки, задаваемые в пикселах.

Если в контейнер помещается менее пяти компонентов, то некоторые области не используются и не занимают места в контейнере. Если не занята область CENTER, то компоненты прижимаются к границам контейнера.

 

Рис. 2. Области размещения BorderLayout

 

Менеджер размещения BorderLayout кажется неудобным: он располагает не больше пяти компонентов, последние растекаются по всей области, области имеют странный вид. Но дело в том, что в каждую область можно поместить не компонент, а панель, и размещать компоненты на ней.

Менеджер GridLayout

Менеджер размещения GridLayout расставляет компоненты в таблицу с заданным в конструкторе числом строк rows и столбцов columns:

GridLayout(int rows, int columns)

Все компоненты получают одинаковый размер. Промежутков между компонентами нет. Второй конструктор позволяет задать промежутки между компонентами в пикселах по горизонтали hgap и вертикали vgap:

GridLayout(int rows, int columns, int hgap, int vgap)

Конструктор по умолчанию GridLayout() задает таблицу размером 0x0 без промежутков между компонентами. Компоненты будут располагаться в одной строке.

Компоненты размещаются менеджером GridLayout слева направо по строкам созданной таблицы в том порядке, в котором они заданы в методах add().

Нулевое количество строк или столбцов означает, что менеджер сам создаст нужное их число.

 

Рис. 3. Пример размещения кнопок менеджером GridLayout

Менеджер CardLayout

Менеджер размещения CardLayout своеобразен — он показывает в контейнере только один, первый (first), компонент. Остальные компоненты лежат под первым в определенном порядке как игральные карты в колоде. Их расположение определяется порядком, в котором написаны методы add(). Следующий компонент можно показать методом next(Container с), предыдущий — методом previous(Container с), Последний — методом last(Container с), первый — методом first(Container с). Аргумент этих методов — ссылка на контейнер, в который помещены компоненты, обычно this.

В классе два конструктора:

· СardLayout() — не отделяет компонент от границ контейнера;

· CardLayout(int hgap, int vgap) — задает горизонтальные hgap и вертикальные vgap поля.

Менеджер CardLayout позволяет организовать и произвольный доступ к компонентам. Метод add() для менеджера CardLayout имеет своеобразный вид:

add(Component comp, Object constraints)

Здесь аргумент constraints должен иметь тип String и содержать имя компонента. Нужный компонент с именем name можно показать методом:

show(Container parent, String name)

 

Рис. 4. Пример менеджера размещения CardLayout

Менеджер GridBagLayout

Менеджер размещения GridBagLayout расставляет компоненты наиболее гибко, позволяя задавать размеры и положение каждого компонента. Но он оказался очень сложным и применяется редко.

В классе GridBagLayout есть только один конструктор по умолчанию, без аргументов. Менеджер класса GridBagLayout, в отличие от других менеджеров размещения, не содержит правил размещения. Он играет только организующую роль. Ему передаются ссылка на компонент и правила расположения этого компонента, а сам он помещает данный компонент по указанным правилам в контейнер. Все правила размещения компонентов задаются в объекте другого класса, GridBagConstraints.

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

Класс GridBagConstraints содержит одиннадцать полей, определяющих размеры компонентов, их положение в контейнере и взаимное положение, и несколько констант — значений некоторых полей. Они перечислены в табл. 1. Эти параметры определяются конструктором, имеющим одиннадцать аргументов. Второй конструктор — конструктор по умолчанию — присваивает параметрам значения, заданные по умолчанию.

 

Таблица 1. Поля класса GridBagConstraints

Поле Значение
anchor Направление размещения компонента в контейнере. Константы: CENTER, NORTH, EAST, NORTHEAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST, и NORTHWEST; no умолчанию CENTER
fill Растяжение компонента для заполнения ячейки. Константы: NONE, HORIZONTAL, VERTICAL, BOTH; ПО умолчанию NONE
gridheight Количество ячеек в колонке, занимаемых компонентом. Целое типа int, по умолчанию 1. Константа REMAINDER означает, что компонент займет остаток колонки, RELATIVE — будет следующим по порядку в колонке
gridwidth Количество ячеек в строке, занимаемых компонентом. Целое типа int, по умолчанию 1. Константа REMAINDER означает, что компонент займет остаток строки, RELATIVE — будет следующим в строке по порядку
gridx Номер ячейки в строке. Самая левая ячейка имеет номер 0. По умолчанию константа RELATIVE, что означает: следующая по порядку
gridy Номер ячейки в столбце. Самая верхняя ячейка имеет номер 0. По умолчанию константа RELATIVE, что означает: следующая по порядку
insets Поля в контейнере. Объект класса insets; по умолчанию объект с нулями
ipadx, ipady Горизонтальные и вертикальные поля вокруг компонентов; по умолчанию 0
weightx, weighty Пропорциональное растяжение компонентов при изменении размера контейнера; по умолчанию 0,0

 

Как правило, объект класса GridBagConstraints создается конструктором по умолчанию, затем значения нужных полей меняются простым присваиванием новых значений, например:

GridBagConstraints gbc = new GridBagConstraints();

gbc.weightx = 1.0;

gbc.gridwidth = GridBagConstraints.REMAINDER;

gbc.gridheight =2;

После создания объекта gbc класса GridBagConstraints менеджеру размещения указывается, что при помещении компонента comp в контейнер следует применять правила, занесенные в объект gbc. Для этого применяется метод

add(Component comp, GridBagConstraints gbc)

Итак, схема применения менеджера GridBagLayout такова:

GridBagLayout gbl = new GridBagLayout(); // Создаем менеджер

setLayout(gbl); // Устанавливаем его в контейнер

// Задаем правила размещения по умолчанию

GridBagConstraints с = new GridBagConstraints();

Button b2 = new Button(); // Создаем компонент

c.gridwidth =2; // Меняем правила размещения

add(bl, с); // Помещаем компонент b2 в контейнер по указанным правилам

//размещения с

Button b2 = new Button(); // Создаем следующий компонент

c.gridwidth = 1; // Меняем правила для его размещения

add(b2, с); // Помещаем в контейнер

и т.д.

 


Дата добавления: 2019-07-15; просмотров: 211; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!