Компоненты многократного использования объединены в языке Java общим названием Beans. Идеологически технология Beans близка компонентной технологии Borland Delphi. Пожалуй, наибольшее отличие этих технологий касается механизма обработки событий. Кратко отметим основные положения компонентной технологии Java Beans.
Назначение – создание специализированных классов, которые удовлетворяют следующим условиям:
· класс решает некоторую изолированную задачу;
· класс можно встраивать в визуальные инструментальные пакеты;
· класс можно многократно использовать с автоматической генерацией части программного кода.
Для описания компонентных классов разработаны простые правила, с помощью которых определяются свойства (в том числе и видимые разработчиком приложения), методы и выполняется обработка событий. Что касается свойств, то общее правило их объявления и использования аналогично свойствам компонентной модели Delphi: свойство – это внутреннее закрытое поле, доступ к которому реализуется только через обращение к соответствующим методам доступа. При этом методы доступа обязательно именуются с помощью префиксов set и get, за которыми идет имя свойства: setName(параметр) и getName( ). Как обычно, set-метод принимает один входной параметр типа внутреннего поля, а get-метод возвращает значение поля. Фрагмент описания компонентного класса:
class MyBeansClass
{ private int Field1; // закрытые поля
private String Field2;
public int getField1( ) {return Field1;} // методы доступа
publicvoid SomeMethod(параметры) { реализация }; // просто метод
};
Отдельно надо хотя бы кратко остановиться на механизме обработки событий. Поскольку язык Java не поддерживает указатели на функции, разработчикам языка пришлось использовать другие подходы. Как и все остальное в языке Java, обработка событий выполняется на объектном уровне с помощью специальных классов, в том числе и интерфейсных (это еще раз подтверждает значение интерфейсов для технологии Java!).
Любое событие генерируется объектом-источником при изменении его внутреннего состояния. Все основные события классифицированы и им поставлены в соответствие некоторые классы. Родоначальником иерархии событий является класс EventObject, от которого порождены следующие основные классы событий:
· ActionEvent – обработка нажатий кнопок или выбор пунктов меню.
· ComponentEvent – общие события при манипуляциях с компонентом.
· ContainerEvent – события при добавлении/удалении компонента из контейнера.
· KeyEvent – события ввода с клавиатуры.
· MouseEvent – «мышиные» события.
· WindowEvent –оконные события.
· ItemEvent – выбор элементов в списках.
· TextEvent – любые изменения в текстовых полях.
Обработку того или иного события выполняет специальный объект-слушатель(listener). Этот объект является экземпляром класса, реализующего некоторый интерфейс, характерный для данного типа события. Для каждого класса событий существует свой интерфейс слушателя, определяющий один или несколько специфических методов обработки данного события. В качестве примера приведем несколько наиболее важных интерфейсов слушателя и определяемых ими методов:
Для обработки события надо создать объект-слушатель и зарегистрировать его в компоненте, который генерирует данное событие. Для регистрации слушателей используются специальные методы add***Listener() и remove***Listener(), где звездочки *** заменяют тип события. Например: addActionListener, addKeyListener, addMouseListener, addItemListener и т.д. Компонент может зарегистрировать несколько слушателей-обработчиков разных событий. Например, если ранее описанный класс MyBeansClass должен обрабатывать события от мыши и клавиатуры, он должен зарегистрировать соответствующих слушателей, для чего в описание класса надо добавить следующие методы:
Информация о всех свойствах компонентного класса и зарегистрированных событиях сохраняется в файле и с помощью механизма отражения доступна в процессе визуального создания программы. Здесь также используется такое важное свойство Bean-компонентов, как сохраняемость (persistence), т.е. способность компонентов записывать себя во внешние файлы с восстановлением своей структуры в более позднее время. Это свойство обеспечивается механизмом сериализации, который является стандартным для всех объектов Java, реализующих интерфейс Serializable. Этот механизм превращает объект в поток байтов, помещаемый во внешний файл. Очень важно, что механизм сериализации позволяет сохранять и восстанавливать объектную структуру любой сложности, т.е. со всеми внутренними объектными свойствами.