Назад
Вперед
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 задают, соответственно, номер
столбца и номер строки для ячейки, в которую
будет помещен компонент. Верхней левой ячейке
соответствуют нулевые значения.
В качестве значений для этих полей можно также
указывать константу GridBagConstraints.RELATIVE. Если данная
константа указано в поле gridx, номер столбца
размещаемого компонента будет на единицу больше
номера столбца для компонента, размещенного
ранее. Аналогично и для поля gridy.
Вы можете использовать значение GridBagConstraints.RELATIVE
в данных полях при последовательном размещении
компонент в ячейках таблицы в направлении слева
направо и сверху вниз.
Поля gridwidth и gridheight определяют количество ячеек,
занимаемых добавляемым компонентом.
Если компонент полностью помещается в одну
ячейку, вы можете задать в этих полях значение
единицы. Если же компонент должен занимать,
например, две смежные ячейки в одной строке, то
для gridwidth нужно задать значение, равное двум, а
для gridheight - значение, равное единице.
Специальное значение GridBagConstraints.REMAINDER
указывает, что компонент должен занять все
оставшееся место в текущей строке (для поля gridwidth)
или в текущем столбце (для поля gridheight).
В поля gridwidth и gridheight можно также записать
значение GridBagConstraints.RELATIVE. В этом случае будет задано
такое расположение компонента, при котором он
займет все оставшееся место в строке (для поля
gridwidth) или столбце (для поля gridheight), оставив при
этом одну свободную ячейку в последнем столбце
или строке.
Поле fill определяет стратегию распределения
компоненту свободного пространства ячейки или
ячеек) таблицы, если размеры компонента меньше
размеров выделенного для него места.
Возможны следующие значения:
Значение |
Стратегия выделения места |
GridBagConstraints.NONE |
Компонент не изменяет своих размеров |
GridBagConstraints.BOTH |
Изменяется высота и ширина, причем таким
образом, чтобы компонент занимал все отведенное
для него пространство |
GridBagConstraints.HORIZONTAL |
Компонент растягивается по горизонтали |
GridBagConstraints.VERTICAL |
Компонент растягивается по вертикали |
Поле anchor задает выравнивание компонента внутри
отведенного для него пространства. Он включается
в работу, когда размеры компонента меньше
размеров выделенного для него места.
Для поля anchor вы можете указать следующие
значения
Значение |
Направление выравнивания |
GridBagConstraints.CENTER |
Центрирование |
GridBagConstraints.NORTH |
Север |
GridBagConstraints.SOUTH |
Юг |
GridBagConstraints.EAST |
Восток |
GridBagConstraints.WEST |
Запад |
GridBagConstraints.NORHEAST |
Север-восток |
GridBagConstraints.NORTHWEST |
Северо-запад |
GridBagConstraints.SOUTHEAST |
Юго-восток |
GridBagConstraints.SOUTHWEST |
Юго-запад |
Эти поля определяют стратегию изменения
размеров компонента, отвечая за выделение
пространства для столбцов (weightx) и строк (weighty).
Если записать в них нулевые значения все
добавленные компоненты соберутся в центре
контейнера и будут выровнены по центру (как по
вертикали, так и по горизонтали).
Чтобы размеры компонента изменялись по
горизонтали или вертикали, в поля weightx и weightx
нужно записать значения от 0.0 до 1.0.
Если в столбце несколько компонентов, то его
ширина будет определяться компонентом с
максимальным значением weightx. Аналогичное
утверждение верно и для строк.
Заметим, что дополнительное пространство
добавляется к строкам и столбцам снизу и справа,
соответственно.
С помощью полей ipadx и ipady вы можете указать, что
размеры компонента необходимо увеличить на
заданное количество пикселов, соответственно, по
горизонтали и вертикали.
Поле insets позволяет задать для компонента
отступы от краев выделенной ему области. По
умолчанию такие отступы отсутствуют.
В поле insets необходимо записать ссылку на объект
класса Insets, созданную соответствующим
конструктором. Этот конструктор имеет следующий
прототип:
public Insets(
int top, // отступ сверху
int left, // -"- слева
int bottom, // -"- снизу
int right); // -"- справа
Описание примера
Окно аплета GridBag1 похоже на окно самого первого
аплета этого раздела библиотеки, где мы
использовали режим размещения FlowLayout (рис. 1).
Рис. 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);
Назад Вперед |