我已经设置了一个Netbeans表单,其中一个文本字段绑定到bean属性。绑定应该是双向的,但只能单向工作。 GUI中字段的更新会更新bean,但如果更新了bean,则GUI不会更新。
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);
我的bean添加了属性更改支持:
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);
}
在我所拥有的物业的安排中:
public void setFname(String newName) {
firePropertyChange("fname", fname, newName);
this.fname = newName;
}
当我更新底层bean时,bean会更新但textfield不会更新(即使我已经验证了属性更改事件正在被触发。
答案 0 :(得分:4)
遇到同样的问题。真烦人我花了很长时间才意识到AutoBinding:它似乎是在createAutoBinding调用中指定的Source和Target之间建立的Property上下文中侦听操作。这就是为什么在JTextField中输入文本更新你的bean属性没有问题。它可以说是在同一个绑定“轨道”上。
这意味着当您尝试通过其来自其他源的setX()调用直接更新JavaBean时,就像我使用JFileChooser一样,即使firePropertyChange方法,自动绑定的成员也看不到它被称为。
这样做不起作用:
myBean1.setFileLocation(fileChooser.getSelectedFile().getAbsolutePath());
所以,我没有做那个调用,而是确保Binding附加了一个'name',它被作为createAutoBinding()调用的最后一个参数放置。我在“高级”选项卡下的Netbeans Matisse Property编辑器Bind弹出工具中执行了此操作。在下面的示例中,它被命名为“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);
让我参与绑定'rail'的调用,以便JTextField将使用我选择的文件进行更新,如下所示:
Binding fileBind = bindingGroup.getBinding("fileLocation");
Property fileProp = fileBind.getSourceProperty();
fileProp.setValue(myBean1, fileChooser.getSelectedFile().getAbsolutePath());
我不得不从全局绑定组中使用getBinding()和getSourceProperty()来解决这个问题,因为Matisse锁定了对原始绑定的直接访问,我不应该编辑它,因为代码是自动生成的。如果您手动编辑代码,那么您始终可以确保拥有可用的名称来直接访问Property对象。
在任何情况下,让“外部影响者”处理bean和JTextField的关键是在Binding Property本身上执行更改。
答案 1 :(得分:1)
最近我尝试使用netbeans创建Swing GUI,我很想知道同样的问题(因此发现了你的帖子)。
您的解决方案应该有效。要记住的只有两件事:
changeSupport.firePropertyChange
之前,必须更改实际的bean属性。请参阅:http://wiki.netbeans.org/BestPracticesWithJPAAndBeansBinding 一旦遵守这两件事,外行应该有效。我还使用JFileChooser来更改文本字段,而不需要手动设置绑定的属性(如其他答案所示)。