2012-03-28 59 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