2012-03-28 57 views
11

我有一个应用程序与几个窗口/视图显示相同的对象。例如,我有一个用户对象的名称和位置字符串和一个ImageIcon他们的照片。与Java的数据绑定

然后在我的窗户,我将使用该用户对象的细节是这样 -

  1. 我创建一个JPanel。
  2. 我添加的JLabel到它(nameLabel,locationLabel,imageLabel)
  3. 我打电话的setText()(或者为的setIcon imageLabel)为每个这些标记物与他们的文本/图像设置为用户的对象数据。

我要反复做了

  1. 在用户对象的数据每用户对象改变了我再次调用的setText()在标签上的时间显示
  2. 每个窗口。

在C#中,当我使用数据绑定的时候,所以当我更新一个对象时,它自动反映到GUI元素中,这个数据绑定到它。 Java有类似的东西吗?

+0

,请与您的问题(S)是/是约???,请张贴[SSCCE(http://sscce.org/)用绑定/数据绑定来展示你的问题 – mKorbel 2012-03-28 12:59:29

+3

我确定了我在上面的列表中做了什么。并非每个问题都需要一个SSCCE,特别是像这样的问题,而不是询问代码问题。我问是否可以用java进行数据绑定,因为在C#中,这是执行GUI工作的标准方式。我还没有在google上找到任何正式的Sun赞同的数据绑定信息,第一页谷歌结果我得到'Java数据绑定'包含像'java数据绑定api没有准备好黄金时间'和'豆绑定:Java数据绑定解决方案与一个严重的问题' – 2012-03-28 13:10:07

+1

那么你的答案可能是波纹管或JSR296 – mKorbel 2012-03-28 13:15:21

回答

3

MVP模式可以帮助你实现这一目标。您必须编写引发自定义事件并附加UI侦听器以响应这些事件(观察者模式)。 Java除Observer和Observable协议外,还提供了PropertyChangeEvents和PropertyChangeListeners。

3

Java SE Application Design数据绑定的文章中有一个例子。

查看使用PropertyChangeSupportAbstractModel

需要注意对象已更改的类将执行PropertyChangeListener(请参阅AbstractController)。

1

我一直在使用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/

0

使用betterbeansbinding.jar文件,而不是beansbinding.jar