分: 使用高级功能(5)
时间:2011-02-11 IBM Scott Delap
接下来,需要重写受损示例的 ModifyListener 中的逻辑,使其对 Contact 对象进行操作,而不是直接对 UI 的小部件进行操作。清单 5 中显示了这个新的属性更改侦听程序。
清单 5. 在 Presentation Model 中实现业务逻辑的新属性更改侦听程序
private class EnablementPropertyChangeListener implements
PropertyChangeListener {
public void propertyChange(PropertyChangeEvent evt) {
boolean enable = false;
if ((getContact().getName() != null &&
getContact().getName().trim().length() > 0) &&
(getContact().getSpouse() != null &&
getContact().getSpouse().trim().length() > 0)) {
enable = true;
} else {
getContact().setYearsMarried(null);
}
setEnableYearsMarried(enable);
}
}
最后,ContactPresentationModel 的构造函数需要将这个新侦听程序与 Contact 的名称属性和配偶属性绑定起来,如清单 6 所示。
清单 6. 向联系人的字段中添加侦听程序
EnablementPropertyChangeListener enablementPropertyChangeListener
= new EnablementPropertyChangeListener();
this.contact.addPropertyChangeListener("name",
enablementPropertyChangeListener);
this.contact.addPropertyChangeListener("spouse",
enablementPropertyChangeListener);
如果在 ContactPresentationModel 测试上单击鼠标右键并将它作为一个 JUnit 测试来运行,则会看到令人满意的 JUnit 成功绿栏,如图 5 所示。
图 5. 测试成功后的 JUnit 视图
以一种完全可测试的不依赖 UI 的方式重写后,现在就有了与受损代码示例相同的业务逻辑。
了解Eclipse中的JFace数据绑定,第3部分: 使用高级功能(6)
时间:2011-02-11 IBM Scott Delap
将 Presentation Model 与 UI 同步
您可能想知道哪些组件必须做 JFace 数据绑定。如您所见,Presentation Model 使代码更易于测试。但是,Presentation Model 中的数据和状态仍没有被反映到 UI 中。自己编写所有同步代码会很费事。幸运的是,可以使用 JFace 数据绑定。通过更改构造函数和 bindGUI() 方法可以轻松地重构受损示例中的 ContactForm,如清单 7 所示。
清单 7. 重构的 ContactForm
public ContactForm(Composite c, ContactPresentationModel
presentationModel) {
this.contact = new Contact();
createControls(c);
createButtons(c);
bindGUI(presentationModel);
}
private void bindGUI(ContactPresentationModel
presentationModel) {
DataBindingContext ctx = createContext();
ctx.bind(nameTxt,
new Property(presentation\
Model.getContact(), "name"),
new BindSpec());
ctx.bind(spouseTxt,
new Property(presentation\
Model.getContact(), "spouse"),
new BindSpec());
ctx.bind(yearsMarriedTxt,
new Property(presentation\
Model.getContact(), "yearsMarried"),
new BindSpec());
ctx.bind(new Property(yearsMarriedTxt, "enabled"),
new Property(presentation\
Model, "enableYearsMarried"),
new BindSpec());
}
接下来,更改示例运行程序中的 run() 方法,如清单 8 所示。
清单 8. 重构的示例运行程序
public void run() {
...
ContactPresentation
|