创建字段(视图)Field是一个抽象类,它定义了包含各种用户界面控件的方法,还有全局地识别这些控件的相关 ID。每个用户界面控件都是 Field的子类,并向内容提供者提供了读写能力。用工厂模式,在 Layout类中创建了 Field。
清单 6. 用 Field 类创建文本对象1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| public class TextField extends Field {
/**
* @param control
* @param id
*/
public TextField(Control control, int id) {
super(control, id);
}
/* Based on the ID of the widget, values retrieved from
* the content provider are set.
*/
public void readFromContent(IExampleContentProvider content) {
String newText = (String )content.getElement(getId());
if (newText != null)
((Text )_control).setText(newText);
}
/* Based on the ID of the widget, values retrieved from widget are
* sent back to the content provider.
*/
public void writeToContent(IExampleContentProvider content) {
String newText = ((Text )_control).getText();
content.setElement(getId(), newText);
}
}
|
简化内容提供者(模型)ExampleViewContentProvider充当模型侦听器,后者扩展自 IStructuredContentProvider。它是 Eclipse API 的简单实现,提供了用于检索数据的回调。每个请求数据的条目都基于视图创建时在布局中为条目定义的惟一 ID。
方法调用会返回与每个定义的全局 ID 关联的数据。在 所示的内容提供者中,可以使用适配器从 XML 文件或数据库检索数据。
清单 7. 在定制的 ContentProvider 中实现方法1
2
3
4
5
6
7
8
9
10
| public Object getElement(int iIndex) {
switch (iIndex) {
case FIRST_INDEX: return "developer@ibm.com";
case SECOND_INDEX : return new Integer(1);
case FOURTH_INDEX : return new Boolean(true);
case THIRD_INDEX: return new Boolean(false);
case FIFTH_INDEX: return new Boolean(false);
}
return null;
}
|
创建了控件并初始化布局之后,表单会用控件 ID 要求内容提供者用数据填充表单控件。
清单 8. 初始化布局并填充控件的表单1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| public Form (Composite parent, int style, FieldMode mode,
ExampleViewContentProvider content) {
super(parent, style);
_content = content;
_style = style;
setMode(mode);
init(style);
}
private void init(int style) {
createControls(style);
controlsCreated();
}
protected void controlsCreated() {
readFromContent();
}
|
结束语Web 应用程序是 MVC 架构样式的早期实现者。但是,随着像 Eclipse 这样的简单而强大的开发平台的到来,程序员可以轻易地用更短的时间和最小的复杂程度,开发出更丰富的用户界面。 |