LayoutManager есть метод setLayout.
Рассмотрим кратко, как работают приведенные выше схемы размеще-
ния.
4.3.3.1. BorderLayout
BorderLayout делит прямоугольный контайнер на 5 прямоугольных
областей: север, юг, запад, восток и центр:
[Image]
Компонента добавляется в соответствующую область с помощью ме-
тода
add (string, component);
Пример.
setLayout (new BorderLayout());
buttonN = new Button ("one");
add ("North", buttonN);
// ... добавление остальных кнопок
4.3.3.2. CardLayout
[Image]
Контейнер состоит из нескольких плоскостей. В каждый момент на-
верху только одна плоскость. Таким образом, CardLayout предс-
тавляет собой как бы блокнот со многими страницами. Cтраницы
помечаются с помощью строк.
Метод добавления компонент к контейнеру:
add (string, component);
где string - имя "страницы", а component - добавляемая компо-
нента. Как правило, эти компоненты сами будут контейнерами
(страница блокнота врядли будет состоять из одной большой кноп-
ки):
setLayout (new CardLayout ());
add ("one", create (new FlowLayout ()));
add ("two", create (new BorderLayout ()));
add ("three", create (new GridLayout (2, 2)));
add ("four", create (new BorderLayout (10, 10)));
add ("five", create (new FlowLayout (FlowLayout.LEFT, 10, 10)));
add ("six", create (new GridLayout (2, 2, 10, 10)));
4.3.3.3. FlowLayout
FlowLayout реализует модель построчного заполнения контейнера.
После заполнения одной строки начинается следующая. При измене-
нии размеров контейнера происходит перераспределение компонент
по строкам.
[Image]
setLayout (new FlowLayout ());
add (new Button ("OK"));
add (new Button ("Cancel"));
add (new Button ("ъesume"));
Новые компоненты добавляются в контейнер с помощью метода
add (component).
Ряды компонент могут быть выравнены вправо, влево, или центри-
рованы.
4.3.3.4. GridLayout
Контейнер разбивается на клетки. Для этого задается число строк
и столбцов. При добавлении новых компонент, клетки заполняются
по строкам. Возможность делать пропуски отсутствует.
Новые компоненты добавляются в контейнер с помощью метода
add (component)
[Image]
Пример.
setLayout (new GridLayout (2, 3)); // 2 строки, 3 столбца
add (new Button ("1"));
add (new Button ("2"));
add (new Button ("3"));
add (new Button ("I"));
add (new Button ("II"));
4.3.3.5. GridBagLayout
GridBagLayout позволяет разделить контейнер на неравные прямоу-
гольные области. Это достигается с помощью об®единения соседних
клеток в клетки большего размера. Кроме того, GridBagLayout
позволяет заполнять решетку с пропусками. Конкретный алгоритм
заполнения определяется об®ектом класса GridBagConstraints.
В об®ектах этого класса имеется более 10 параметров, определяю-
щих размещение следующей компоненты. Программа, использующая
GridBagConstraints, может выглядеть следующим образом:
GridBagLayout gridbag = new GridBagLayout ();
GridBagConstraints c = new GridBagConstraints ();
setLayout (gridbag);
// Устанавливаем характеристики
c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0;
. . .
Button button1 = new Button ("1");
gridbag.setConstraints (button1, c);
add (button1);
. . .
// здесь можно изменить некоторые установки
// об®екте класса GridBagConstraints,
// например
// c.fill = GridBagConstraints.NONE;
Button buttonX= new Button ("X");
gridbag.setConstraints (buttonX, c);
add (buttonX);
4.3.4. События
В AWT, как и в других оконных средах, события как программные
об®екты соответствуют внешним событиям. Типичный пример - нажа-
тие на кнопку, в результате чего в AWT происходит событие
ACTION_EVENT.
Таким образом, интерактивная часть программ в AWT соответствует
модели программы, управляемой событиями. Другими словами, при-
ложения или аплеты должны отслеживать события и обрабатывать
их.
Рассмотрим подробнее, как это происходит в AWT. Каждый оконный
интерфейс можно рассматривать как набор (возможно, вложенных
друг в друга) компонент. Когда происходит событие, связанное с
каким-то элементом интерфейса (например, кнопкой), то вызывает-
ся метод handleEvent. По умолчанию этот метод ничего не делает,
а просто передает событие наверх, то есть тому об®екту, в кото-
ром содержится инициатор события (например, об®емлющему окну).
Таким образом, если событие никто не перехватывает, оно дости-
гает фрейма (если это приложение) или аплета.
Этот базовай механизм обработки событий при наивном применении
навязывает программисту одну из двух моделей обработки событий.
- Во-первых, можно позволить всем событиям всплывать до самого
верха и уже на уровне фрейма писать метод, который занимается
разбором и обработкой событий.
- Во-вторых, можно создать множество специализированных клас-
сов, в каждом из которых переопределен метод handleEvent.
Оба этих крайних подхода небезупречны. Первый способствует на-
Читать дальше