2011-08-16 86 views
1

我已經建立了一個NetBeans表單,並且綁定了一個bean屬性的文本字段。綁定應該是雙向的,但只能單向運行。更新GUI中的字段會更新bean,但如果更新了bean,則GUI不會更新。Netbeans綁定字段沒有更新圖形用戶界面

,Netbeans的生成的代碼看起來像這樣爲每個屬性:

binding=org.jdesktop.beansbinding.Bindings.createAutoBinding(
    org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, crmmast1, 
    org.jdesktop.beansbinding.ELProperty.create("${fname}"), lname, 
    org.jdesktop.beansbinding.BeanProperty.create("text")); 

bindingGroup.addBinding(binding); 

我的豆已性質變化的支持:

private PropertyChangeSupport changeSupport = new 
     PropertyChangeSupport(this);; 

    public void addPropertyChangeListener (PropertyChangeListener listener) { 
     changeSupport.addPropertyChangeListener(listener); 
    } 

    public void removePropertyChangeListener(
     PropertyChangeListener listener) {  
     changeSupport.removePropertyChangeListener(listener); 
    } 

    public void firePropertyChange (String propertyName, 
     Object old, Object newObj) { 
     changeSupport.firePropertyChange(propertyName, old, newObj); 
    } 

內SETT的性質我有:

public void setFname(String newName) { 
    firePropertyChange("fname", fname, newName); 
    this.fname = newName; 
} 

當我更新底層bean時,bean更新但文本域不(甚至儘管我已經證實財產變更事件正在被解僱。

回答

4

出現同樣的問題。真的很煩人。我花了很長時間才意識到有關AutoBinding的一些情況:它看起來像在createAutoBinding調用中指定的源和目標之間建立的屬性上下文中監聽動作。這就是爲什麼在JTextField中輸入文本更新到您的bean屬性沒有問題。可以這麼說,它在同一個綁定「鐵路」上。

這意味着當你試圖通過setX()直接從其他來源調用JavaBean來更新JavaBean時,就像我使用JFileChooser一樣,自動綁定的成員看不到它,即使firePropertyChange方法被調用。

這樣做行不通:

myBean1.setFileLocation(fileChooser.getSelectedFile().getAbsolutePath()); 

因此,而不是做這一號召,我代替所做的就是確保綁定有一個「名稱」連接到它,它被放在最後,參數在createAutoBinding()調用中。我在Netbeans Matisse Property編輯器的「高級」選項卡下的「綁定」彈出式工具中執行此操作。在下面的例子中,它被命名爲「fileLocation」。

binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, 
myBean1, 
org.jdesktop.beansbinding.ELProperty.create("${fileLocation}"), 
jTextField12, 
org.jdesktop.beansbinding.BeanProperty.create("text"), 
"fileLocation"); 
bindingGroup.addBinding(binding); 

這讓我在結合「鐵路」,以便將JtextField將與我的選擇的文件更新調用看起來像下面這樣:

  Binding fileBind = bindingGroup.getBinding("fileLocation"); 
      Property fileProp = fileBind.getSourceProperty(); 
      fileProp.setValue(myBean1, fileChooser.getSelectedFile().getAbsolutePath()); 

我有getBinding拉這件事()和來自全局綁定組的getSourceProperty(),因爲Matisse會鎖定對原始綁定的直接訪問,並且我不應該編輯它,因爲代碼是自動生成的。如果你手工編輯你的代碼,那麼你可以確保你有一個可用的名字來直接訪問Property對象。

在任何情況下,獲取「外部影響者」來處理bean和JTextField的關鍵是在綁定屬性本身上執行更改。

+0

有關正確的方法,請參閱下面猴子的回答。您必須先在bean上設置值,然後再觸發屬性更改。 –

1

最近我嘗試使用NetBeans創建Swing GUI,並且我對完全相同的問題感到疑惑(因此找到了您的文章)。

您的解決方案應該可以工作。只有兩件事情要記住:

  1. 你將不得不一旦你傳播豆改變(在你的情況FNAME應該沒問題)
  2. 實際bean屬性必須提供正確的prorperty名稱變更在調用changeSupport.firePropertyChange之前。見:http://wiki.netbeans.org/BestPracticesWithJPAAndBeansBinding

一旦這兩件事情都服從了,應該有效。我還使用JFileChooser來更改文本字段,並且不需要手動設置綁定的屬性(如其他答案所示)。

相關問題