
- •Java Beans
- •План лекции
- •Объектный подход
- •Понятие компонента
- •Требования к разработке компонентов
- •Контейнеры и компоненты
- •Существующие компонентные модели
- •JavaBeans
- •Интроспекция
- •Компоненты JavaBeans
- •Достоинства JavaBeans
- •Требования к компоненту JavaBeans
- •Удивительное рядом
- •Свойства
- •Простые свойства
- •Бин с простым свойством
- •Работа с простыми свойствами
- •Индексированные свойства
- •Бин с индексированным свойством
- •Работа с индексированными свойствами
- •Связанные свойства
- •Бин со связанным свойством
- •Бин со связанным свойством
- •Работа со связанными свойствами
- •Контролируемые свойства
- •Бин с контролируемым свойством
- •Бин с контролируемым свойством
- •VetoChangeListener
- •Графические компоненты
- •Графический бин
- •Графический бин
- •Работа с графическим бином
- •Модель делегирования обработки событий
- •Модель делегирования обработки событий
- •Слушатели и источники
- •События JavaBeans
- •Работа с событиями
- •Работа с событиями
- •Работа с событиями
- •Работа с событиями
- •Результат работы приложения
- •Персистентнось
- •Упаковка в Jar
- •Добавление библиотек в палитру
- •Вложенные типы
- •План лекции
- •Синтаксически корректный код
- •Вложенные типы
- •Статические вложенные классы
- •Вложенные интерфейсы
- •Нестатические вложенные классы
- •Пример внутреннего класса
- •И ещё один пример
- •И его результат…
- •Локальные классы
- •Локальные классы
- •Анонимные классы
- •Пример анонимного класса
- •Спасибо за внимание!
- •Дополнительные источники

Связанные свойства
Поддерживают механизм оповещения об изменениях значений свойств
Обработчики реализуют интерфейс
PropertyChangeListener и принимают объекты PropertyChangeEvent, содержащие имя свойства и его старое и новое значения
Используется вспомогательный класс
PropertyChangeSupport
21

Бин со связанным свойством
public class MyBean implements PropertyChangeListener, Serializable {
private String message;
private String[] lines = new String[5]; private final PropertyChangeSupport pcs =
new PropertyChangeSupport(this);
public MyBean() { pcs.addPropertyChangeListener(this);
}
public void addPropertyChangeListener( PropertyChangeListener listener) {
pcs.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(
PropertyChangeListener listener) { pcs.removePropertyChangeListener(listener);
}
...
22

Бин со связанным свойством
...
public void setMessage(String message) { String old = this.message; this.message = message;
pcs.firePropertyChange("message", old, message);
}
...
public void setLines(int index, String line) { String old = this.lines[index]; this.lines[index] = line;
pcs.fireIndexedPropertyChange("lines", index, old, lines);
}
...
public void propertyChange(PropertyChangeEvent evt) {
//some property change logic
}
...
23

Работа со связанными свойствами
24

Контролируемые свойства
Похожи на связанные свойства, но перед присвоением нового значения свойства оно должно быть проверено обработчиками
Любой обработчик в праве запретить изменение, в этом случае значение свойства останется прежним
Обработчики реализуют интерфейс
VetoableChangeListener и принимают объекты PropertyChangeEvent, содержащие имя свойства и его старое и новое значения
Используется вспомогательный класс
VetoableChangeSupport
25

Бин с контролируемым свойством
public class MyBean implements java.io.Serializable { private String message;
private final VetoableChangeSupport vcs =
new VetoableChangeSupport(this);
public MyBean() {
vcs.addVetoableChangeListener(new VetoChangeListener());
}
public void addVetoableChangeListener(
VetoableChangeListener lnr) {
vcs.addVetoableChangeListener(lnr);
}
public void removeVetoableChangeListener( VetoableChangeListener lnr){
vcs.removeVetoableChangeListener(lnr);
}
...
26

Бин с контролируемым свойством
...
public void setMessage(String message) { String old = this.message;
try {
vcs.fireVetoableChange("message", old, message); this.message = message;
...
} catch (PropertyVetoException e) { this.message = old;
}
}
...
}
27

VetoChangeListener
public class VetoChangeListener implements
VetoableChangeListener {
public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
String eventName = evt.getPropertyName(); if (eventName.equalsIgnoreCase("message")) {
String message = (String) evt.getNewValue(); if (message.toLowerCase().contains("hello")) {
throw new PropertyVetoException("Veto!!", evt);
}
System.out.println("Message applied = " + message);
}
}
}
28

Графические компоненты
Если компоненты содержит средства визуализации, то его суперкласом должен быть:
java.awt.Component
если создается компонент на базе AWT
javax.swing.JComponent
если создается компонент на базе Swing
Хотя и компоненты AWT, и компоненты Swing являются компонентами JavaBeans, не рекомендуется смешивать их в одном контейнере
29

Графический бин
public class MyBean extends JComponent
implements java.io.Serializable {
private String message = "!!!";
...
protected void paintComponent(Graphics g) {
g.setColor(getForeground());
int height = g.getFontMetrics().getHeight();
if (message != null) { g.drawString(message, 0, height);
}
}
...
30