Transcript JavaBeans

Java Advanced
JavaBeans
Содержание
СПбГУ ИТМО
1.
2.
3.
4.
Введение
Реализация
Применение
Хранение
5. Функции
6. Заключение
Georgiy Korneev
Java Advanced / JavaBeans
2
Часть 1
Введение
JavaBeans


Компонентная модель языка Java
Основные понятия





Bean
Свойство (property)
Событие (event)
Сохраняемость (persistance)
Примеры


Компонента GUI
Модель GUI
Georgiy Korneev
Java Advanced / JavaBeans
4
Свойство

Свойство


Getter


xxx
getXxx или isXxx
Setter

setXxx
Georgiy Korneev
Java Advanced / JavaBeans
5
Типы свойств
Простое (simple)
 Индексируемое (indexed)
 Связанное (bound)
 Ограниченное (constrained)

Georgiy Korneev
Java Advanced / JavaBeans
6
События


Генерируются при изменении свойства
PropertyChangeEvent – событие




getPropertyName() – имя свойства
getOldValue() – старое значение
getNewValue() – новое значение
PropertyChangeListener – слушатель

propertyChange(PropertyChangeEvent) –
получатель события
Georgiy Korneev
Java Advanced / JavaBeans
7
Часть 2
Реализация JavaBean
JavaBean-Класс


Имеет конструктор по умолчанию
Содержит одно или несколько свойств
Georgiy Korneev
Java Advanced / JavaBeans
9
Пример. Простое свойство


Свойство title
Поле
private String title;

Getter
public String getTitle() {
return title;
}

Setter
public void setTitle(String title) {
return this.title = title;
}
Georgiy Korneev
Java Advanced / JavaBeans
10
Реализация связанных свойств

Класс PropertyChangeSupport





PropertyChangeSupport(Object source) –
конструктор
firePropertyChange(name, oldValue, newValue) –
генерация события
addPropertyChangeListener(listener) –
добавление слушателя на все свойства
addPropertyChangeListener(name, listener) –
добавление слушателя на указанное свойство
removePropertyChangeListener(name?, listener)
– удаление слушателя
Georgiy Korneev
Java Advanced / JavaBeans
11
Пример. Связанное свойство

Property change support
private final PropertyChangeSupport pcs =
new PropertyChangeSupport(this);

Setter
public void setTitle(String title) {
String oldValue = this.title;
this.title = title;
pcs.firePropertyChange("title", oldValue, this.title);
}
Georgiy Korneev
Java Advanced / JavaBeans
12
Ограниченные свойства

Процесс установки значения




Сохранение старого значения свойства
Извещение о предстоящем изменении
Установка нового значения
Извещение об установке нового значения
Georgiy Korneev
Java Advanced / JavaBeans
13
Отклонение изменения свойства

VetoableChangeListener – слушатель



vetoableChange(PropertyChangeEvent event) –
событие
PropertyVetoException – бросается при
отклонении изменения
Класс VetoableChangeSupport



fireVetoableChange – сообщение о
предстоящем изменении
addVetoableChangeListener – добавление
removeVetoableChangeListener – удаление
Georgiy Korneev
Java Advanced / JavaBeans
14
Пример. Ограниченное свойство

Vetoable change support
private final VetoableChangeSupport vcs =
new VetoableChangeSupport(this);

Setter
public void setTitle(String title) throws
PropertyVetoException {
String oldValue = this.title;
vcs.fireVetoableChange("title", oldValue, title);
this.title = title;
pcs.firePropertyChange("title", oldValue, title);
}
Georgiy Korneev
Java Advanced / JavaBeans
15
Индексированные свойства

Getter



Setter



setXxx(index, value)
setXxx(Value[])
IndexedPropertyChangeEvent


Value[] getXxx
getXxx(index)
getIndex() – индекс измененного элемента
PropertyChangeSupport

fireIndexedPropertyChange(name, index,
oldValue, newValue) – генерация события
Georgiy Korneev
Java Advanced / JavaBeans
16
Часть 3
Применение JavaBean
Пассивная GUI-компонента (1)
Отображает информацию из модели, не
позволяя ее редактировать
 При обновлении модели должна
перерисовываться
 Примеры



Индикатор прогресса
Список событий
Georgiy Korneev
Java Advanced / JavaBeans
18
Пассивная GUI-компонента (1)
Компонента
Создание
Перерисовка
Перерисовка
Уничтожение
Georgiy Korneev
Модель
Добавление слушателя
Извещение слушателя
Извещение слушателя
Модификация
Модификация
Удаление слушателя
Java Advanced / JavaBeans
19
Активная GUI-компонента (1)
Отображает информацию из модели, и
позволяет ее редактировать
 При обновлении модели должна
перерисовываться
 При изменении информации обновляет
модель
 Примеры




Полоса прокрутки
Выбор из списка
Текстовое поле
Georgiy Korneev
Java Advanced / JavaBeans
20
Активная GUI-компонента (2)
Компонента
Создание
Модель
Добавление слушателя
Добавление в слушатели
Перерисовка
Модификация
Уничтожение
Georgiy Korneev
Извещение слушателя
Извещение слушателя
Модификация
Извещение
слушателей
Удаление слушателя
Java Advanced / JavaBeans
21
Обрыв цепочки сообщений
Компонента
Модификация
Модель
Установка нового значения
Извещение слушателя
Установка нового значения
Значения
равны
Georgiy Korneev
Извещение слушателя
Java Advanced / JavaBeans
22
Приемы обработки

Хранение данных только в модели




Каскадирование изменений


Все данные хранятся в модели
При изменении данных модель отслеживает
зависимости
Независимые редакторы свойств
При изменении модели изменяется и другая
модель
Явное обновление пассивной компоненты

Слушатель модели обновляет компоненту
Georgiy Korneev
Java Advanced / JavaBeans
23
Часть 4
Хранение JavaBeans
Краткосрочное хранение

Сериализация



Serializable
Externalizable
По умолчанию, списки слушателей не
сериализуются
Georgiy Korneev
Java Advanced / JavaBeans
25
Долговременное хранение
XMLEnconder – сохранение состояния
 XMLDecoder – загрузка состояния
 Процесс сохранения



Создание объекта конструктором по
умолчанию
Сравнение всех свойств


Georgiy Korneev
При неравенстве – запись свойства
При равенстве – ничего
Java Advanced / JavaBeans
26
Пример. XMLEncoder
JButton button;
XMLEncoder encoder = new XMLEncoder(
new BufferedOutputStream(
new FileOutputStream("button.xml")));
encoder.writeObject(button);
encoder.close();
Georgiy Korneev
Java Advanced / JavaBeans
27
Пример. XMLDecoder
JButton button;
XMLDecoder decoder = new XMLDecoder(
new BufferedInputStream(
new FileInputStream("button.xml")));
button = (JButton) decoder.readObject();
decoder.close();
Georgiy Korneev
Java Advanced / JavaBeans
28
Формат XML-файла
<java> – основной контейнер
 <object class=“…”> – объект
 <void method=“…”> – вызов метода
 <void property=“…”> – установка свойства
 <int>, <string>, … – значения
 <array> – массив

Georgiy Korneev
Java Advanced / JavaBeans
29
Часть 5
Самоописание
Самоописание (introspection)


Способ описания свойств JavaBean
Преимущества



Переносимость
Повторное использование
Совместимость
Georgiy Korneev
Java Advanced / JavaBeans
31
Описание JavaBean


Интерфейс BeanInfo
Методы





BeanDescriptor getBeanDescriptor() –
дескриптор
PropertyDescriptor[] getPropertyDescriptors() –
описания свойств
EventSetDescriptor[] getEventSetDescriptors() –
дескрипторы групп сообщений
MethodDescriptor[] getMethodDescriptors() –
дескрипторы методов
Класс SimpleBeanInfo
Georgiy Korneev
Java Advanced / JavaBeans
32
Дескриптор возможности


Класс FeatureDescriptor
Методы




getName() – имя возможности
getDisplayName() – отображаемое имя
getShortDescription() – описание возможности
isPreffered(), isExpert(), isHidden() – уровень
видимости
Georgiy Korneev
Java Advanced / JavaBeans
33
Дескриптор свойства


Класс PropertyDescriptor
Методы






getPropertyType() – тип свойства
getReadMethod() – getter
getWriteMethod() – setter
isBound(), isConstrained() – тип свойства
getPropertyEditorClass() – тип редактора
свойства
Класс IndexedPropertyDescriptor

getIndexedRead(Write)Method()
Georgiy Korneev
Java Advanced / JavaBeans
34
Дескриптор группы событий


Класс EventSetDescriptor
Методы



getListenerType() – тип слушателя
getAddListenerMethod() – метод добавления
слушателя
getRemoveListenerMethod() – метод удаления
слушателя
Georgiy Korneev
Java Advanced / JavaBeans
35
Дескриптор метода


Класс MethodDescriptor
Методы



getMethod() – метод
getParameterDescriptors() – дескрипторы
аргументов метода
Класс ParameterDescriptor
Georgiy Korneev
Java Advanced / JavaBeans
36
Получение информации о JavaBean


Класс Introspector
Загрузка информации для



Поиск XxxBeanInfo
Анализ методов
Методы


getBeanInfo(beanClass) – получение описания
getBeanInfo(beanClass, stopClass) – получение
частичного описания
Georgiy Korneev
Java Advanced / JavaBeans
37
GUI-редакторы
Позволяют редактировать свойства
JavaBean
 Позволяют добавлять связи по событиям
 Позволяют добавлять обработчики
событий

Georgiy Korneev
Java Advanced / JavaBeans
38
Часть 6
Заключение
JavaBean
Класс с конструктором по умолчанию
 Содержит свойства
 Позволяет добавлять слушателей
 Serializable

Georgiy Korneev
Java Advanced / JavaBeans
40
Ссылки
 JavaBeans
Specification //
http://java.sun.com/products/javabeans/docs/s
pec.html
 JavaBeans

Trail in Java Tutorial //
http://java.sun.com/docs/books/tutorial/javabea
ns/
Long-term JavaBean persistance //
http://java.sun.com/products/jfc/tsc/articles/per
sistence2/
Georgiy Korneev
Java Advanced / JavaBeans
41
Вопросы
СПбГУ ИТМО
Georgiy Korneev
Java Advanced / JavaBeans
42