1

我已经设置了一个带有绑定到 bean 属性的文本字段的 Netbeans 表单。绑定应该是双向的,但只能单向工作。更新 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 会更新,但文本字段不会(即使我已经验证了属性更改事件正在被触发。

4

2 回答 2

4

遇到同样的问题。真烦人。我花了很长时间才意识到关于 AutoBinding 的一些事情:它似乎在侦听您在 createAutoBinding 调用中指定的 Source 和 Target 之间建立的 Property 上下文中的操作。这就是为什么在 JTextField 中输入文本可以毫无问题地更新到您的 bean 属性的原因。可以这么说,它在同一个绑定“轨道”上。

这意味着当您尝试通过 setX() 直接从另一个源调用更新您的 JavaBean 时,就像我对 JFileChooser 所做的那样,自动绑定的成员看不到它,即使调用了 firePropertyChange 方法。

这样做不起作用:

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

因此,我没有进行该调用,而是确保绑定具有附加的“名称”,该名称作为 createAutoBinding() 调用中的最后一个参数放置。我在高级选项卡下的 Netbeans Matisse 属性编辑器绑定弹出工具中执行此操作。在下面的示例中,它被命名为“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 属性本身进行更改。

于 2011-10-14T22:34:51.640 回答
1

最近我尝试使用 netbeans 创建 Swing GUI,我想知道完全相同的问题(因此找到了你的帖子)。

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

  1. 传播 bean 更改后,您必须提供正确的属性名称(在您的情况下,fname 应该可以)
  2. changeSupport.firePropertyChange在调用之前必须更改实际的 bean 属性。请参阅:http ://wiki.netbeans.org/BestPracticesWithJPAAndBeansBinding

一旦遵守了这两件事,一切都应该起作用。我还使用 JFileChooser 来更改文本字段,并且无需手动设置绑定的属性(如其他答案所建议的那样)。

于 2016-08-09T08:39:06.730 回答