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

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

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

Назад Вперед

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).

pic1.gif (3199 bytes)

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

Если ввести какую-либо текстовую строку в верхнем поле редактирования, а затем нажать кнопку, эта строка будет скопирована в нижнее поле редактирования.

Если изменить размеры окна аплета, например, растянув его по горизонтали, изменится взаимное расположение компонент (рис. 2).

pic2.gif (3124 bytes)

Рис. 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());
  }
} 

Назад Вперед

[Назад]