通常,您希望 GUI 的用户从预先确定的值列表中进行选择。列表 控件是做到这一点的最简单的方法。列表显示了一组预先定义的、用户可以从中进行选择的字符串值。列表通常需要大量的屏幕实际信息(real estate)。如果您想节省空间,那么可以使用组合框 控件,组合框允许在需要的时候让列表处于下拉状态。组合框还可以有选择地允许用户在类似文本的字段中输入所需要的值。
必须将组合框定义为以下两种互斥样式之一:
SIMPLE 显示值的列表。
DROP_DOWN 使值的列表处于下拉状态。
组合框支持一种可选样式:
READ_ONLY 防止用户编辑此组合框的文本字段。
我所讨论的所有控件(列表、组合框、表和树)都支持以下两种互斥样式之一:
SINGLE 用户只能选择一个项。
MULTI 用户可以选择多个项。
这些控件还支持其他样式:
H_SCROLL 在需要时显示了一个水平滚动的条。
V_SCROLL 在需要时显示了一个垂直滚动的条。
创建组合框和列表相当容易。创建这些控件和添加所需要的字符串值,如清单 4 所示。
清单 4. 使用 FormLayout 创建一个组合框和一个列
2 import org.eclipse.swt.widgets.*;
3 import org.eclipse.swt.events.*;
4 import org.eclipse.swt.layout.*;
5 :
6 setLayout(new FormLayout());
7 String[] data = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5",
8 "Item 6", "Item 7", "Item 8", "Item 9", "Item 10" };
9 Combo c = createCombo(this, data);
10 configureLayout(c, new FormAttachment(0, 5), new FormAttachment(0, 5),
11 new FormAttachment(100, -5), null);
12 List l = createList(this, data);
13 configureLayout(l, new FormAttachment(0, 5), new FormAttachment(c, 5),
14 new FormAttachment(100, -5), new FormAttachment(100, -5));
15 // Create a Combo
16 protected Combo createCombo(Composite parent, String[] data) {
17 Combo combo = new Combo(parent,
18 SWT.DROP_DOWN | SWT.MULTI |
19 SWT.V_SCROLL | SWT.H_SCROLL);
20 combo.addSelectionListener(new SelectionListener() {
21 :
22 });
23 setComboContents(data);
24 return combo;
25 }
26 // Create a List
27 protected List createList(Composite parent, String[] data) {
28 List list = new List(parent, SWT.MULTI |
29 SWT.V_SCROLL | SWT.H_SCROLL);
30 list.addSelectionListener(new SelectionListener() {
31 :
32 });
33 setListContents(data);
34 return list;
35 }
36 public void setComboContents(String[] data) {
37 combo.removeAll();
38 for (int i = 0; i < data.length; i++) {
39 combo.add(data[i]);
40 }
41 }
42 public void setListContents(String[] data) {
43 list.removeAll();
44 for (int i = 0; i < data.length; i++) {
45 list.add(data[i]);
46 }
47 }
48
如果添加 SelectionListener,那么它允许应用程序在用户更改所选定的项时采取行动。
清单 4 中的主代码序列的流假定 SelectionListener 包含在 this 引用的一些合成物中。它创建了如图 5 中所示的组合框和(部分已隐藏的)列表。
图 5. 组合框和列表的例子

您可以使用组合框控件的一个叫做 CCombo 的替代实现(位于 org.eclipse.swt.custom 包中)。除了支持一些额外的功能,CCombo 类似于 Combo,最重要的是,您可以以编程方式要求 CCombo 将文本剪切、复制或粘贴到它的嵌入式 Text 控件中,反之亦可。此外,CCombo 总是以 DROP_DOWN 样式出现,所以它不支持类型样式。
CCombos 还支持一些可选样式:
BORDER 显示了一个围绕文本区的边框。
READ_ONLY 防止用户编辑该组合框的文本字段。
FormLayout
清单 4 中的例子使用 FormLayout 来放置组合框和列表。FormLayout 是最有用的布局管理器之一,因为它允许您相对于其他控件来安排每个控件,允许您将控件的任意一边(左边、顶部、右边或底部)附着到另一个控件的(通常相对的)边,或者附着到容器的某一边上。未附着的边则采用该控件的自然相对维数(natural corresponding dimension)。可以使用 FormAttachment 的一个实例,将引用控件或容器大小的百分比指定为附着点,并提供距离此点的像素偏移量。清单 4 中的代码使用了来自清单 5 的 helper 方法。
清单 5. configureLayout: FormLayout 帮助器方法
2 FormAttachment left,
3 FormAttachment top,
4 FormAttachment right,
5 FormAttachment bottom) {
6 FormData fd = new FormData();
7 if (left != null) {
8 fd.left = left;
9 }
10 if (top != null) {
11 fd.top = top;
12 }
13 if (right != null) {
14 fd.right = right;
15 }
16 if (bottom != null) {
17 fd.bottom = bottom;
18 }
19 c.setLayoutData(fd);
20 }
21