я давно пишу с java и c # и
Я закодировал свой собственный propertyChangeListeners в Java, имитируя .net и здесь, под моим методом.
Для сериализации этого объекта я закодировал специальные фильтры против сериализатора, т.е. XStream, сериализация нативных объектов Java
Если вам нужно «сделай сам», вы можете использовать мой путь или пройти через инфраструктуру Oracle, как @Pau Kiat Wee связал ее в своем ответе.
Посмотрите JGoodies для связывания данных Swing для более встроенных вещей http://www.jgoodies.com/download/presentations/binding.pdf
http://www.jgoodies.com/downloads/demos/
Вот моя реализация,
Ваш бизнес-объект будет расширен из этого абстрактного класса.
Конечно, если вы уже расширяетесь от чего-то другого, и это не
один из твоих этот вариант невозможно для тебя.
Скорее всего, у вас нет намерения сериализовать propertyChangeListeners
регистрантов и отправлять некоторые данные куда-нибудь вместе с ним (удаленная служба, которая не знает вашего класса, зависящего от пользовательского интерфейса, и это будет головной болью). вот так.
Обратите внимание private void writeObject(java.io.ObjectOutputStream
out)
и private void readObject(java.io.ObjectInputStream in)
подписи. Я намеренно оставил их пустыми, и эти значительные
подписи метода считаются Java Object Serialization
.
Это наш имитированный интерфейс PropertyChangeEvent, мы будем использовать шаблон наблюдателя для уведомления наших владельцев регистрации.
public interface IPropertyChangedListener extends EventListener {
public void onPropertyChanged(Object source,String propertyName,Object oldValue,Object newValue);
}
Это наша база DataBusinessObject
public abstract class DataObjectBase implements Serializable {
private List<IPropertyChangedListener> propertyChangeListeners=new ArrayList<IPropertyChangedListener>();
public void addOnPropertyChangedListener(IPropertyChangedListener propertyChangeListener)
{
ensureRegisterListCreated();
propertyChangeListeners.add(propertyChangeListener);
}
public void removeOnPropertyChangedListener(IPropertyChangedListener propertyChangeListener)
{
ensureRegisterListCreated();
propertyChangeListeners.remove(propertyChangeListener);
}
public DataObjectBase()
{
ensureRegisterListCreated();
}
public void ensureRegisterListCreated()
{
if(propertyChangeListeners==null)
propertyChangeListeners=new ArrayList<IPropertyChangedListener>();
}
protected void onPropertyChanged(Object source,String propertyName,Object oldValue,Object newValue)
{
if(propertyChangeListeners.size()<=0)
return;
for (IPropertyChangedListener listener : propertyChangeListeners) {
listener.onPropertyChanged(source, propertyName, oldValue, newValue);
}
}
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
{
}
private void readObject(java.io.ObjectInputStream in)
throws IOException {
}
}
Теперь давайте использовать его
dataObject.addOnPropertyChangedListener(new IPropertyChangedListener() {
@Override
public void onPropertyChanged(Object source, String propertyName,
Object oldValue, Object newValue) {
System.out.println(String.format("%s %s %s",propertyName,oldValue,newValue));
//TODO:Fire your UI change now !!!
}
});
Вот что вам нужно сделать в вашем dataObject
public class dataObject extends BaseDataObject
{
private String editable;
public String getEditable() {
return editable;
}
public void setEditable(String isEditable) {
String oldValue=this.editable;
this.editable = isEditable;
onPropertyChanged(this,"Editable",oldValue,isEditable);
}
}
Если ты не хочешь идти по моему пути, или ты не можешь по какой-то причине. Вы должны следовать JGoodies, это кажется лучшим из всех.
В демоверсиях скачайте файл JNLP и вы увидите часть DataBinding. При нажатии на стрелку, расположенную вверху справа, появляется раздел кода. Удачи!
http://www.jgoodies.com/downloads/demos/