没有实现 WizardPage 的类, ContactWizard 就不会有任何行为。您可以将向导看成是一堆卡片,每一张卡片都有自己的布局和设计。每个 WizardPage 负责向导中单个页面(即卡片)的布局和行为。要创建 WizardPage ,我们需要创建继承 WizardPage 基本实现的子类并实现 createControl 方法,从而为向导页面创建特定的 GUI 控件。
开发 WizardPage 时,需要完成下列各项:
使用指定父项创建一个组合。
创建窗口小部件的布局。对于 BasicContactPage 类,使用 GridLayout。
在第 2 步创建的布局中构造并布置窗口小部件。清单 6 演示了在 ContactWizard 类中构造和布置 BasicContactPage 所需的代码。请参阅 图 1中该向导页面的抓屏。
清单 6. BasicContactPage 类中的 createControl 方法
2 public void createControl(Composite parent)
3 {
4 Compositecontainer = new Composite(parent, SWT.NULL);
5 GridLayoutlayout = new GridLayout();
6 container.setLayout(layout);
7 layout.numColumns = 2;
8 layout.verticalSpacing = 9;
9
10 Label label= new Label(container, SWT.NULL);
11 label.setText("&Given Name:");
12
13 givenNameText = new Text(container, SWT.BORDER | SWT.SINGLE);
14
15 GridData gd= new GridData(GridData.FILL_HORIZONTAL);
16 givenNameText.setLayoutData(gd);
17 givenNameText.addModifyListener(new ModifyListener()
18 {
19 public void modifyText(ModifyEvent e)
20 {
21 dialogChanged();
22 }
23 });
24
25 label = newLabel(container, SWT.NULL);
26 label.setText("&Family Name:");
27
28 familyNameText = new Text(container, SWT.BORDER | SWT.SINGLE);
29 gd = newGridData(GridData.FILL_HORIZONTAL);
30 familyNameText.setLayoutData(gd);
31 familyNameText.addModifyListener(new ModifyListener()
32 {
33 public void modifyText(ModifyEvent e)
34 {
35 dialogChanged();
36 }
37 });
38
39 label = newLabel(container, SWT.NULL);
40 label.setText("&Nickname:");
41
42 nickNameText= new Text(container, SWT.BORDER | SWT.SINGLE);
43 gd = newGridData(GridData.FILL_HORIZONTAL);
44 nickNameText.setLayoutData(gd);
45
46 createLine(container, layout.numColumns);
47
48 label = newLabel(container, SWT.NULL);
49 label.setText("&Business Phone:");
50
51 businessPhoneText = new Text(container, SWT.BORDER | SWT.SINGLE);
52 gd = newGridData(GridData.FILL_HORIZONTAL);
53 businessPhoneText.setLayoutData(gd);
54
55 label = new Label(container, SWT.NULL);
56 label.setText("&Home Phone:");
57
58 homePhoneText = new Text(container, SWT.BORDER | SWT.SINGLE);
59 gd = newGridData(GridData.FILL_HORIZONTAL);
60 homePhoneText.setLayoutData(gd);
61
62 createLine(container, layout.numColumns);
63
64 label = newLabel(container, SWT.NULL);
65 label.setText("&E-Mail Address:");
66
67 emailText =new Text(container, SWT.BORDER | SWT.SINGLE);
68 gd = newGridData(GridData.FILL_HORIZONTAL);
69 emailText.setLayoutData(gd);
70 emailText.addModifyListener(newModifyListener()
71 {
72 public void modifyText(ModifyEvent e)
73 {
74 dialogChanged();
75 }
76 });
77
78 //dialogChanged();
79 setControl(container);
80 }
81 ...
82
为任何可能需要输入验证或转换的窗口小部件创建侦听器。对于 BasicContactPage 类,创建了几个 ModifyListeners 对特定数据域执行输入验证。无论何时修改文本域中的文本,都要执行 dialogChanged 方法。该方法负责处理错误并将错误报告给向导。 清单 7演示了处理输入验证和将任何错误通知向导所需的代码。
清单 7. 处理输入验证类的 dialogChanged 和 updateStatus 方法
2 private void dialogChanged()
3 {
4 if (this.getGivenName().length() == 0)
5 {
6 updateStatus("Given name must be specified.");
7 return;
8 }
9 if (this.getFamilyName().length() == 0)
10 {
11 updateStatus("Family name must be specified.");
12 return;
13 }
14 if (this.getEmail().length() > 0)
15 {
16 if (this.getEmail().indexOf("@") < 0)
17 {
18 updateStatus("Enter your email address as yourname@yourdomain.com");
19 return;
20 }
21 }
22 updateStatus(null);
23 }
24 private void updateStatus(String message)
25 {
26 setErrorMessage(message);
27 setPageComplete(message == null);
28 ...
29
运行地址簿应用程序
要测试和运行地址簿应用程序,请完成下列步骤:
在解包源代码的目录中运行下面这个命令: ant run
执行 Ant 脚本之后,应当会出现地址簿应用程序。
从 File 菜单选择 New Contact 以启动 JFace Contact 向导。请参阅 图 5。
图 5. Microsoft Windows XP 上 Contact 向导的两个页面
结束语
通过引入 SWT/JFace 用户界面工具箱,Eclipse 项目最终为 Java 开发人员提供了一种创建高度交互式客户机端应用程序的方法。使用象 JFace 向导这样的组件来研究如何用最少的代码来创建收集用户输入的灵活机制,确实令人兴奋。示例地址簿应用程序提供了一个构建和打包框架,您可以用该框架来创建自己的独立 SWT/JFace 应用程序。
下载本文中 示例的源代码