将 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() {
...
ContactPresentationModel presentationModel = /
new ContactPresentationModel(contact);
ContactForm contactForm = new ContactForm(shell, presentationModel);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
|