标签。最后,将标签更改为数字 4。两个错误标签都应当为空,因为未出现过任何验证错误。
图 8. 带有显示验证错误的 UI 示例
主-从关系的表
应用程序经常提供对象的汇总列表。选中一个列表后,详细信息就会显示在表单中。此类功能可以被编码到 JFace 数据绑定中,方法是使用一个集合小部件,例如 List 或 Table。然后可以将选中的值绑定到显示详细信息记录的目标表单上。
实现此功能的第一个步骤是创建另一个 Presentation Model 来保存要显示的表的列表。清单 19 显示了此功能的代码。这个 Presentation Model 还保存了一个 WritableValue 以保留表的选项状态。请再次注意,所有状态都被从 UI 表小部件中提取出来,并用 Presentation Model 来表示。
清单 19. TableForm 的 Presentation Model
public class TablePresentationModel extends
PropertyChangeAware {
private List contacts;
private WritableValue selectedContact;
public TablePresentationModel(List contacts) {
this.contacts = contacts;
this.selectedContact = new WritableValue(Contact.class);
this.selectedContact.setValue(contacts.get(0));
}
public List getContacts() {
return contacts;
}
public void setContacts(List contacts) {
this.contacts = contacts;
}
public WritableValue getSelectedContactObservable() {
return selectedContact;
}
public void setSelectedContactObservable\
(WritableValue selectedContact) {
this.selectedContact = selectedContact;
}
}
了解Eclipse中的JFace数据绑定,第3部分: 使用高级功能(12)
时间:2011-02-11 IBM Scott Delap
创建了 Presentation Model 之后,现在需要一个 UI。清单 20 显示了 TableForm 类的代码。
清单 20. TableForm 的实现
public class TableForm {
private TableViewer contactsTableViewer;
public TableForm(Composite c, TablePresentationModel presentationModel) {
createControls(c);
bindGUI(presentationModel);
}
private void bindGUI(TablePresentationModel presentationModel){
DataBindingContext ctx = createContext();
ctx.bind(new Property(this.contactsTableViewer,
ViewersProperties.CONTENT), new TableModelDescription(new
Property(presentationModel, "contacts", Contact.class, true),
new String[] {"name", "spouse"}), null);
ctx.bind(new Property(this.contactsTableViewer,
ViewersProperties.SINGLE_SELECTION),
presentationModel.getSelectedContactObservable(), null);
}
private void createControls(Composite c) {
GridData gridData = new
GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 2;
this.contactsTableViewer = new TableViewer(c,
SWT.BORDER);
this.contactsTableViewer.getTable().setLayoutData(gridData);
}
public static DataBindingContext createContext() {
DataBindingContext context = new DataBindingContext();
context.addObservableFactory(new
BeanObservableFactory(context, null,
new Class[] { Widget.class
|