gpt4 book ai didi

java - Netbeans 绑定(bind)字段不更新 GUI

转载 作者:行者123 更新时间:2023-11-29 08:12:45 24 4
gpt4 key购买 nike

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

最佳答案

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

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

这样做是行不通的:

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

因此,我没有执行该调用,而是确保 Binding 附加了一个“名称”,该名称作为 createAutoBinding() 调用中的最后一个参数。我在高级选项卡下的 Netbeans Matisse 属性编辑器绑定(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);

让我进入绑定(bind)“轨道”以便 JTextField 使用我选择的文件进行更新的调用如下所示:

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

我不得不使用全局绑定(bind)组中的 getBinding() 和 getSourceProperty() 来解决这个问题,因为 Matisse 锁定了对原始绑定(bind)的直接访问,而且我不应该编辑它,因为代码是自动生成的。如果您正在手动编辑代码,那么您始终可以确保您有一个可用的名称来直接访问 Property 对象。

无论如何,让“外部影响者”处理 bean 和 JTextField 的关键是对绑定(bind)属性本身执行更改。

关于java - Netbeans 绑定(bind)字段不更新 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7082958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com