除了菜单的例子之外,本文中的所有例子都使用了一个叫做 BasicApplication 的基类,以简化它们的实现。作为另一个非常好的实践的例子,我将 SWT GUI 应用程序的一些常见功能应用到这个基类中(包括来自菜单示例的 helper 方法),以使它们更易于使用。
BasicApplication 是一个合成物,它创建了自己的 shell。该类提供了一些额外的功能,比如退出确认对话框(参见图 8),以及将小部件树作为诊断帮助工具(diagnostic aid)转储出来的能力(参见清单 9 中一个经过删减的例子)。
图 8. 确认消息对话框

清单 9. 控件层次结构的打印输出(部分)
2 Tree1App {}
3 Tree {}
4 TreeItem {<root>}
5 TreeItem {Child.0}
6 TreeItem {Child.0.0}
7 TreeItem {Child.0.0.0}
8 TreeItem {Child.0.0.1}
9 TreeItem {Child.0.0.2}
10 TreeItem {Child.0.1}
11 TreeItem {Child.0.1.0}
12 TreeItem {Child.0.1.1}
13 TreeItem {Child.0.1.2}
14 TreeItem {Child.0.2}
15 TreeItem {Child.0.2.0}
16 TreeItem {Child.0.2.1}
17 TreeItem {Child.0.2.2}
18 TreeItem {Child.1}
19 :
20 TreeItem {Child.2}
21 :
22
清单 10 显示了每个子类(来自 清单 4 中组合框和列表的例子)的 main 方法,并提供了 shell 的标题和大小、应用程序合成物的样式和所有命令行输入。
清单 10. 示例列表应用程序的 main 方法
2 run(List1App.class.getName(), "List1App Example", SWT.NONE, 400, 300, args);
3 }
4
每个通过 Java 反射技术加载的子类都必须定义一个构造函数和 completeGui 方法。子类可以选择性地提供 initGui 方法。再一次使用 清单 4 中的组合框和列表应用程序作为例子,这些方法如清单 11 中所示。
清单 11. 应用程序子类中提供的所需要的方法
2 super(shell, style); // must always supply parent and style
3 }
4 // Allow subclasses to complete the GUI
5 protected void completeGui(String[] args) {
6 // create GUI here
7 :
8 }
9 // Allow subclasses to initialize the GUI
10 protected void initGui() {
11 // finish GUI and add dynamic contents here
12 :
13 }
14
MessageBox
在结束本文的讨论之前,我将向您展示如何使用 MessageBox 控件请求用户输入选择的信息。
必须将 MessageBox 定义为以下 5 种互斥样式之一:
ICON_ERROR 表示一条错误消息。
ICON_INFORMATION 表示一条信息消息。
ICON_QUESTION 表示一条问题消息。
ICON_WARNING 表示一条警告消息。
ICON_WORKING 表示一条运行情况消息。
MessageBoxes 支持其他一些可选样式,所有样式都表示了它们在按钮上的各自选择:
OK, OK | CANCEL
YES | NO, YES | NO | CANCEL
RETRY | CANCEL
ABORT | RETRY | IGNORE
清单 12 显示了 MessageBox 一个典型用法,它在用户关闭应用程序 shell 时显示确认对话框,如 图 8 所示。
清单 12. 使用 MessageBox 创建一个退出确认对话框
2 public void shellClosed(ShellEvent e) {
3 MessageBox mb = new MessageBox(shell, SWT.ICON_QUESTION | SWT.OK | SWT.CANCEL);
4 mb.setText("Confirm Exit");
5 mb.setMessage("Are you sure you want to exit?");
6 int rc = mb.open();
7 e.doit = rc == SWT.OK;
8 }
9 });
10
结束语
在 SWT 和 JFace 系列的第二期中,我介绍了更多的 SWT 控件:组合框、列表、表和树。我还展示了如何为 SWT 应用程序创建基类,以及如何使用 helper 方法使构建 GUI 变得更容易。
本系列的下一期将向您展示如何创建更多的容器和输入控件,以及如何使用 StackLayout 布局管理器。
代码下载:os-jface2source.ZIP