Netbeans Bound Field未更新GUI

时间:2011-08-16 18:13:45

标签: java netbeans jtextfield propertychangelistener

我已经设置了一个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不会更新(即使我已经验证了属性更改事件正在被触发。

2 个答案:

答案 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,我很想知道同样的问题(因此发现了你的帖子)。

您的解决方案应该有效。要记住的只有两件事:

  1. 传播bean更改后,您必须提供正确的prorperty名称(在您的情况下fname应该没问题)
  2. 在调用changeSupport.firePropertyChange之前,必须更改实际的bean属性。请参阅:http://wiki.netbeans.org/BestPracticesWithJPAAndBeansBinding
  3. 一旦遵守这两件事,外行应该有效。我还使用JFileChooser来更改文本字段,而不需要手动设置绑定的属性(如其他答案所示)。