如何让JFace数据绑定实现双向生效,解决仅视图到模型单向生效问题
问题原因
单向绑定问题核心是JFace DataBinding的BeanProperties要求POJO符合JavaBean规范,具备属性变更通知能力,你当前的POJO没有实现属性变更事件触发逻辑,框架感知不到模型侧的数值变化,因此无法同步到视图。
解决方法
方案1:为POJO添加属性变更通知能力(推荐)
修改SqlDataModel类,添加属性变更监听支持,在setter执行时触发变更事件:
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; public class SqlDataModel { private final PropertyChangeSupport changeSupport = new PropertyChangeSupport(this); private String length; public String getLength() { return length; } public void setLength(String length) { String oldValue = this.length; this.length = length; changeSupport.firePropertyChange("length", oldValue, length); } public void addPropertyChangeListener(PropertyChangeListener listener) { changeSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { changeSupport.removePropertyChangeListener(listener); } // 其余原有逻辑 }
修改后原有绑定逻辑不需要改动,即可实现双向同步。
方案2:使用PojoProperties替代BeanProperties
如果你不想修改原有POJO结构,可以改用不需要属性变更通知的PojoProperties,它会自动处理普通POJO的变更同步:
修改绑定逻辑中的模型 observable 构造部分:
IObservableValue<String> propertyLength = PojoProperties.value(SqlDataModel.class, "length", String.class) .observe(dataModel);
注意:该方案仅在你主动调用setter修改属性、或者切换绑定的model对象时触发视图同步,性能略低于方案1
选中项切换场景适配
你的场景是Eclipse属性视图,选中不同对象时需要更新展示内容,此时不要重复创建DataBindingContext,直接替换observable关联的模型对象即可:
// 选中项变更监听器中调用 propertyLength.setObserved(newSelectedSqlDataModel);
内容的提问来源于stack exchange,提问作者sluppennudel
相关产品推荐
相关产品推荐

