Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
85
Добавлен:
08.06.2015
Размер:
841.73 Кб
Скачать

Связанные свойства

Поддерживают механизм оповещения об изменениях значений свойств

Обработчики реализуют интерфейс

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