标签可能是最简单的控件,标签 被用于显示纯文本(没有颜色、特殊字体或样式的文本)或称为图标的小图像。标签不接受焦点(换句话说,用户不能通过 Tab 键或鼠标移动到标签),因此,标签无法产生输入事件。
清单 1 展示了如何创建一个简单的文本标签。
清单 1. 创建一个带文本的标签
2 :
3 Composite parent = ...;
4 :
5 // create a center aligned label
6 Label label = new Label(parent, SWT.CENTER);
7 label.setText("This is the label text");
8
注意,该文本是采用不同于构造函数的单独的方法设置的。这是所有 SWT 控件的一个典型象征。只有父控件和样式是在构造函数中设置的,其他所有属性都是在已创建的对象上设置的。
由于平台的限制,标准标签控件不能同时拥有文本和图标。为了支持同时拥有文本和图标,可以使用 CLabel 控件,如清单 2 中所示。
清单 2. 创建一个包含文本和图像的标签
2 import org.eclipse.swt.widget.*;
3 import org.eclipse.swt.custom.*;
4 :
5 Composite parent = ...;
6 Image image = ...;
7 :
8 // create a left aligned label with an icon
9 CLabel Clabel = new CLabel(parent, SWT.LEFT);
10 label.setText("This is the imaged label text"");
11 label.setImage(image);
12
文本
在标签显示文本的同时,您时常还想允许用户插入文本。文本 控件就是用于此目的的。文本可以是单行的(一个文本字段),也可以是多行的(一个文本区域)。文本还可以是只读的。文本字段中没有描述,因此,常常通过标签控件处理它们,以确定它们的用途。文本控件还可以包含一个“工具提示”,提供关于控件用途的信息(所有控件都支持这一特性)。
清单 3 显示了如何使用允许使用的有限数量的特性来创建一个简单的文本字段。选择默认文本是为了便于擦除。
清单 3. 创建一个包含选定的默认文本和一个限制条件的文本
2 :
3 Composite parent = ...;
4 :
5 // create a text field
6 Text name = new Text(parent, SWT.SINGLE);
7 name.setText("<none>");
8 name.setTextLimit(50);
9 name.setToolTipText("Enter your name -- Last, First");
10 name.selectAll(); // enable fast erase
11
按钮
通常,您希望用户指出应该何时进行某项操作。最常见的做法是使用按钮 控件。存在以下几种样式的按钮:
ARROW —— 显示为一个指向上、下、左、右方向的箭头。
CHECK —— 已标记的复选标记。
FLAT —— 没有凸起外观的按钮。
PUSH —— 瞬时按钮(最常见的事件源)。
RADIO —— 具有排他性的粘性标记(sticky mark),其他所有单选按钮都在相同的组中。
TOGGLE —— 一个粘性按钮。
清单 4 创建了一个“Clear”按钮:
清单 4. 创建一个按钮
2 :
3 Composite parent = ...;
4 :
5 // create a push button
6 Button clear = new Button(parent, SWT.PUSH);
7 clear.setText("Clea&r");
8
名称中的 & 导致利用紧接着的一个字母创建一个加速器,允许通过 Ctrl+<字母> 顺序的方式按下按钮(控件顺序由主机操作系统决定)。
事件监听器
通常,您可能想在选择按钮(特别是某种推式按钮)的时候执行一些操作。您可以通过向该按钮添加一个 SelectionListener(在 org.eclipse.swt.events 包中)做到这一点。当按钮状态发生改变时(通常是按钮被按下),就会生成事件。清单 5 在单击 Clear 按钮时输出一条消息。
清单 5. 按钮事件处理程序
2 :
3 // Clear button pressed event handler
4 clear.addSelectionListener(new SelectionListener() {
5 public void widgetelected(selectionEvent e) {
6 System.out.println("Clear pressed!");
7 }
8 public void widgetDefaultSelected(selectionEvent e) {
9 widgetelected(e);
10 }
11 });
12
此代码使用了一个匿名的内部类,但您还可以使用指定的内部类或单独的类作为监听器。多数包含两个或更多方法的 ...Listener 类还有一个类似的 ...Adapter 类,这个类提供了一些空的方法实现,并且可以减少您需要编写的代码数量。例如,还有一个 SelectionAdapter 类,这个类实现了 SelectionListener。
注意,在这些方法中执行的操作必须快速完成(通常不足一秒时间),或者说 GUI 的反应将是迟钝的。更长时间的操作(比如访问文件)需要单独的线程,但那是以后某期文章的主题。