我已经用 java 和 c# 编码很长时间了
我通过模仿 .net 和我的方法在 Java 中编写了我自己的 propertyChangeListeners。
为了对这个对象进行序列化,我编写了针对序列化程序的特殊过滤器,即XStream , java 原生对象序列化
如果您需要 DIY,您可以使用我的方式,或者您也可以通过 Oracle 的基础架构取得进展,因为@Pau Kiat Wee 在他/她的回答中将其链接。
查看 JGoodies for Swing 数据绑定以了解更多已内置的东西http://www.jgoodies.com/download/presentations/binding.pdf
http://www.jgoodies.com/downloads/demos/
这是我的实现,
您的业务对象将从这个抽象类扩展。
当然,如果您已经从其他东西扩展,而这不是
您的其中一个选项不可能为您工作。
您很可能无意序列化propertyChangeListeners 注册者并将一些数据发送到某个地方(远程服务不知道您的 UI 依赖类,这会让人头疼)。所以,我们跳过序列化这边。
请注意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/