Назад
Вперед
5.1. Режим FlowLayout
Пример демонстрирует использование режима
размещения FlowLayout системы Layout Manager.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Демонстрация
(ваш браузер должен уметь работать с аплетами
Java JDK 1.1)
Немного теории
Начинающих программистов, особенно тех, кто
создавал приложения для Windows или OS/2, может
шокировать способ, которым в приложениях Java
выполняется размещение компонент и контейнеров
внутри окна. Самая большая и неприятная на первый
взгляд новость заключается в невозможности
размещения компонент с указанием точных
координат (хотя в одном из примеров этого раздела
мы покажем, что это все-таки можно сделать).
Другая новость - программы Java не имеют ресурсов,
подобных ресурсам исполнимых файлов Windows и
описывающих диалоговые панели или органы
управления. Внешний вид пользовательского
интерфейса определяется динамически во время
выполнения программы.
Поясним, в чем тут дело и для чего нужно
преодалевать такие трудности.
Создавая приложения Java, никогда не следует
забывать о том, что они должны обеспечивать
возможность работы на различных компьютерных
платформах. При этом вы не можете полагаться на
то, что вам будет доступен какой-либо конкретный
шрифт, что кнопки или другие компоненты будут
иметь определенный размер или форму, а
видеоадаптер будет работать в режиме с
каким-либо заданным или заранее известным
разрешением.
Для того чтобы обеспечить возможность работы
приложений Windows в режимах с различным
разрешением видеоадаптера размеры органов
управления привязывались к размерам системного
шрифта. Однако указанный способ недостаточно
универсален для применения на различных
платформах, так как в разных операционных
системах эта привязка может выполняться
по-разному. Кроме того, теоретически понятие
"системный шрифт" в какой-нибудь
операционной системе может отсутствовать как
таковое.
С другой стороны, динамическое формирование
внешнего вида пользовательского интерфейса во
время работы программы позволит адаптировать
его "на ходу" к особенностям конкретной
операционной системы. Для этого приложения Java
используют достаточно гибкую и мощную систему
управления размещением компонент и контейнеров
с названием Layout Manager.
Система Layout Manager способна работать в нескольких
основных режимах, применяющих различные
стратегии размещения компонент, определения их
размеров и выравнивания.
В этом разделе мы проиллюстрируем на
конкретном примере самый простой режим - FlowLayout.
В режиме FlowLayout компоненты добавляются в окно
контейнера с применением очень простого
алгоритма. Каждый новый добавленный компонент
располагается вслед за предыдущим в направлении
слева направо и сверху вниз, при этом выполняется
центровка компонент по горизонтали.
Одной из особенностей данного режима является
возможное изменение взаимного расположения
добавленных компонент при изменении размеров
контейнера.
Установка режима FlowLayout выполняется при помощи
метода setLayout, как это показано ниже:
setLayout(new FlowLayout());
Далее компоненты добавляются в окно контейнера
методом add, например:
TextField tf;
Button btnGetName;
. . .
add(tf);
add(btnGetName);
Описание примера
В примере аплета GetName мы выполняем размещение
двух текстовых полей редактирования, одной
кнопки и одного поля класса Label (рис. 1).
Рис. 1. Окно аплета GetName
Если ввести какую-либо текстовую строку в
верхнем поле редактирования, а затем нажать
кнопку, эта строка будет скопирована в нижнее
поле редактирования.
Если изменить размеры окна аплета, например,
растянув его по горизонтали, изменится взаимное
расположение компонент (рис. 2).
Рис. 2. Изменение взаимного расположения
компонент при растягивании окна аплета GetName
В рамках режима FlowLayout избавиться от такого
эффекта невозможно, однако другие схемы, которые
мы рассмотрим в следующих примерах, позволяют
это сделать.
Рассмотрим исходный текст аплета GetName.
Главный класс аплета
Главный класс аплета GetName создан на базе класса
Applet и реализует интерфейс ActionListener:
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class GetName extends Applet
implements ActionListener
{
. . .
}
Данный интерфейс применяется для обработки
событий от кнопки.
В главном классе аплета мы также определили
поля для хранения ссылок на текстовые поля
редактирования, кнопку и поле класса Label:
TextField tf;
TextField tf2;
Button btnGetName;
Label lb;
Метод 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 предназначено только для
отображения строк, но не для редактирования,
поэтому мы запретили редактирование методом
setEditable.
После создания компонент мы устанавливаем
режим размещения FlowLayout:
setLayout(new FlowLayout());
Далее компоненты добавляются в окно аплета
методом add:
add(tf);
add(btnGetName);
add(lb);
add(tf2);
И, наконец, перед тем как вернуть управление,
метод init регистрирует обработчик событий от
кнопки:
btnGetName.addActionListener(this);
Метод actionPerformed
Этот метод получает управление, когда
пользователь нажимает кнопку Enter name. Он выполняет
простое копирование текста из поля tf в поле tf2:
public void actionPerformed(ActionEvent e)
{
if(e.getSource().equals(btnGetName))
{
tf2.setText(tf.getText());
}
}
Назад Вперед |