我一直在使用java和c#编写很长时间,并且 我在Java中通过模仿.net编码了自己的propertyChangeListeners,并且在我的方法之下。
对于这个对象的序列化,我编码了针对序列化器的特殊滤波器, XStream,java原生对象序列化
如果您需要DIY,您可以使用我的方式,或者您也可以通过Oracle的基础架构进行升级,因为@Pau Kiat Wee将其链接到他/她的答案中。
有秋千数据看的JGoodies更多的已建成的东西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/
,请与您的问题(S)是/是约???,请张贴[SSCCE(http://sscce.org/)用绑定/数据绑定来展示你的问题 – mKorbel 2012-03-28 12:59:29
我确定了我在上面的列表中做了什么。并非每个问题都需要一个SSCCE,特别是像这样的问题,而不是询问代码问题。我问是否可以用java进行数据绑定,因为在C#中,这是执行GUI工作的标准方式。我还没有在google上找到任何正式的Sun赞同的数据绑定信息,第一页谷歌结果我得到'Java数据绑定'包含像'java数据绑定api没有准备好黄金时间'和'豆绑定:Java数据绑定解决方案与一个严重的问题' – 2012-03-28 13:10:07
那么你的答案可能是波纹管或JSR296 – mKorbel 2012-03-28 13:15:21