Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Режим FlowLayout
Режим GridLayout
Режим BorderLayout
Режим CardLayout
GridBagLayout -  пример 1
GridBagLayout - заполнение формы
Инструментальная линейка
Панели
Точное размещение компонент
Прилипчивая кнопка

Назад Вперед

5.5. Режим GridBagLayout - простейший пример

Пример демонстрирует простейшее использование режима размещения GridBagLayout системы Layout Manager для орагнизации формы ввода.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Демонстрация
(ваш браузер должен уметь работать с аплетами Java JDK 1.1)

Немного теории

Последний режим размещения системы LayoutManager, использование которого мы продемонстрируем в нашей библиотеке примеров, это режим GridBagLayout. Данный режим вызывает наибольшие трудности у программистов, однако по сравнению с другими режимами он очень гибкий. В ряде случаев вам просто не обойтись без него.

Чтобы облегчить понимание принципов работы режима GridBagLayout мы приведем несколько примеров разной сложности.

Так же как и рассмотренный нами ранее режим GridLayout, режим GridBagLayout предполагает размещение компонент в ячейках некоторой таблицы заданной размерности. Вот наиболее важные отличия между этими режимами:

  • в режиме GridLayout размещаемые компоненты изменяют свои размеры таким образом, чтобы заполнить ячейки таблицы, в которых они располагаются. Режим GridBagLayout позволяет контролировать этот процесс, причем при необходимости вы можете задать стратегию такого изменения или отменить его вовсе;
  • в режиме GridLayout каждый компонент занимает только одну ячейку. Что же касается режима GridBagLayout, то здесь компоненты могут занимать несколько смежных ячеек в строках или столбцах;
  • при изменении размеров контейнера во время работы приложения при использовании режима GridLayout все компоненты неизбежно также будут изменять свои размеры. Это далеко не всегда удобно. В режиме GridBagLayout вы можете управлять стратегией изменения размеров компонент или отменить такое изменение.

Как пользоваться режимом размещения GridBagLayout?

Схема достаточно проста.

Прежде всего вы должны создать объект класса GridBagLayout при помощи конструктора и выбрать эго, как это показано ниже:

GridBagLayout gbl = new GridBagLayout();
setLayout(gbl);

Далее вам нужно создать объект класса GridBagConstraints, поля которого будут определять параметры размещения отдельных компонент:

GridBagConstraints c =  new GridBagConstraints();

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

c.anchor = GridBagConstraints.NORTH; 
c.fill   = GridBagConstraints.NONE;  
c.gridheight = 1;
c.gridwidth  = GridBagConstraints.REMAINDER; 
c.gridx = GridBagConstraints.RELATIVE; 
c.gridy = GridBagConstraints.RELATIVE; 
c.insets = new Insets(40, 0, 0, 0);
c.ipadx = 0;
c.ipady = 0;
c.weightx = 0.0;
c.weighty = 0.0;

Подготовив объект класса GridBagConstraints, вам нужно установить его в системе Layout Manager методом setConstraints и добавить очередной компонент в окно контейнера методом add:

tf = new TextField(30);
gbl.setConstraints(tf, c);
add(tf);

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

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

Очевидно, только в выборе значений параметров объекта класса GridBagConstraints.

Перечислим эти поля и дадим их краткое описание. Полную информацию вы найдете в документации JDK.

  • gridx и gridy

Поля gridx и gridy задают, соответственно, номер столбца и номер строки для ячейки, в которую будет помещен компонент. Верхней левой ячейке соответствуют нулевые значения.

В качестве значений для этих полей можно также указывать константу GridBagConstraints.RELATIVE. Если данная константа указано в поле gridx, номер столбца размещаемого компонента будет на единицу больше номера столбца для компонента, размещенного ранее. Аналогично и для поля gridy.

Вы можете использовать значение GridBagConstraints.RELATIVE в данных полях при последовательном размещении компонент в ячейках таблицы в направлении слева направо и сверху вниз.

  • gridwidth и gridheight

Поля gridwidth и gridheight определяют количество ячеек, занимаемых добавляемым компонентом.

Если компонент полностью помещается в одну ячейку, вы можете задать в этих полях значение единицы. Если же компонент должен занимать, например, две смежные ячейки в одной строке, то для gridwidth нужно задать значение, равное двум, а для gridheight - значение, равное единице.

Специальное значение GridBagConstraints.REMAINDER указывает, что компонент должен занять все оставшееся место в текущей строке (для поля gridwidth) или в текущем столбце (для поля gridheight).

В поля gridwidth и gridheight можно также записать значение GridBagConstraints.RELATIVE. В этом случае будет задано такое расположение компонента, при котором он займет все оставшееся место в строке (для поля gridwidth) или столбце (для поля gridheight), оставив при этом одну свободную ячейку в последнем столбце или строке.

  • fill

Поле fill определяет стратегию распределения компоненту свободного пространства ячейки или ячеек) таблицы, если размеры компонента меньше размеров выделенного для него места.

Возможны следующие значения:

Значение Стратегия выделения места
GridBagConstraints.NONE Компонент не изменяет своих размеров
GridBagConstraints.BOTH Изменяется высота и ширина, причем таким образом, чтобы компонент занимал все отведенное для него пространство
GridBagConstraints.HORIZONTAL Компонент растягивается по горизонтали
GridBagConstraints.VERTICAL Компонент растягивается по вертикали
  • anchor

Поле anchor задает выравнивание компонента внутри отведенного для него пространства. Он включается в работу, когда размеры компонента меньше размеров выделенного для него места.

Для поля anchor вы можете указать следующие значения

Значение Направление выравнивания
GridBagConstraints.CENTER Центрирование
GridBagConstraints.NORTH Север
GridBagConstraints.SOUTH Юг
GridBagConstraints.EAST Восток
GridBagConstraints.WEST Запад
GridBagConstraints.NORHEAST Север-восток
GridBagConstraints.NORTHWEST Северо-запад
GridBagConstraints.SOUTHEAST Юго-восток
GridBagConstraints.SOUTHWEST Юго-запад
  • weightx и weighty

Эти поля определяют стратегию изменения размеров компонента, отвечая за выделение пространства для столбцов (weightx) и строк (weighty).

Если записать в них нулевые значения все добавленные компоненты соберутся в центре контейнера и будут выровнены по центру (как по вертикали, так и по горизонтали).

Чтобы размеры компонента изменялись по горизонтали или вертикали, в поля weightx и weightx нужно записать значения от 0.0 до 1.0.

Если в столбце несколько компонентов, то его ширина будет определяться компонентом с максимальным значением weightx. Аналогичное утверждение верно и для строк.

Заметим, что дополнительное пространство добавляется к строкам и столбцам снизу и справа, соответственно.

  • ipadx и ipady

С помощью полей ipadx и ipady вы можете указать, что размеры компонента необходимо увеличить на заданное количество пикселов, соответственно, по горизонтали и вертикали.

  • insets

Поле insets позволяет задать для компонента отступы от краев выделенной ему области. По умолчанию такие отступы отсутствуют.

В поле insets необходимо записать ссылку на объект класса Insets, созданную соответствующим конструктором. Этот конструктор имеет следующий прототип:

public Insets(
  int top,      // отступ сверху
  int left,     // -"- слева
  int bottom,   // -"- снизу
  int right);   // -"- справа

Описание примера

Окно аплета GridBag1 похоже на окно самого первого аплета этого раздела библиотеки, где мы использовали режим размещения FlowLayout (рис. 1).

pic1.gif (3655 bytes)

Рис. 1. Окно аплета GridBag1

Однако при изменении размеров этого окна взаимное расположение и размеры компонентов не изменяются. Это достигнуто использованием режима GridBagLayout и соответствующей настройкой полей класса GridBagConstraints.

Рассмотрим исходный текст аплета GridBag1, заострив внимание на методе init, в котором происходит самое интересное.

Метод init

В методе init мы создаем два однострочных поля редактирования текста и одну кнопку:

tf = new TextField(30);
btnGetName = new Button("Enter name");
lb = new Label("Your name is: ");
tf2 = new TextField(30);
tf2.setEditable(false);

Для поля tf2 мы отключаем режим редактирования.

Далее мы создаем объекты классов GridBagLayout и GridBagConstraints:

GridBagLayout gbl = new GridBagLayout();
GridBagConstraints c = 
  new GridBagConstraints();

Для окна аплета устанавливается режим размещения компонент GridBagLayout:

setLayout(gbl);

На следующем шаге мы подготавливаем поля объекта класса GridBagConstraints для размещения первого текстового поля tf:

c.anchor = GridBagConstraints.NORTH; 
c.fill   = GridBagConstraints.NONE;  
c.gridheight = 1;
c.gridwidth  = GridBagConstraints.REMAINDER; 
c.gridx = GridBagConstraints.RELATIVE; 
c.gridy = GridBagConstraints.RELATIVE; 
c.insets = new Insets(40, 0, 0, 0);
c.ipadx = 0;
c.ipady = 0;
c.weightx = 0.0;
c.weighty = 0.0;

Чтобы размеры текстового поля не изменялись при изменении размеров окна контейнера, мы указали в поле fill значение GridBagConstraints.NONE.

Так как в поле gridwidth находится значение GridBagConstraints.REMAINDER, это поле будет единственным компонентом в первой строке. В результате следующий компонент (кнопка) добавится во вторую строку.

Подготовив параметры, мы устанавливаем их в системе размещения Layout Manager и добавляем поле в окно аплета:

gbl.setConstraints(tf, c);
add(tf);

Кнопка добавляется аналогично:

c.insets = new Insets(5, 0, 0, 0);
gbl.setConstraints(btnGetName, c);
add(btnGetName);

Заметьте, что все параметры, кроме отступов, заданных в поле insets, мы оставили без изменения.

Аналогичным образом мы поступили и с полем Label:

c.insets = new Insets(10, 0, 0, 0);
gbl.setConstraints(lb, c);
add(lb);

Для второго поля редактирования мы задали значение weighty, равное 1.0:

c.insets = new Insets(5, 0, 0, 0);
c.weightx = 0.0;
c.weighty = 1.0;
c.gridheight = GridBagConstraints.REMAINDER; 
gbl.setConstraints(tf2, c);
add(tf2);

Это приведет к тому, что последняя строка займет все оставшееся снизу пространство контейнера.

Последнее действие программы init - регистрация обработчика событий для кнопки:

btnGetName.addActionListener(this);

Назад Вперед

[Назад]