我们已经了解了如何创建显示和一些小窗口,以及运行应用程序的消息循环。实际的工作是在何处进行的?每当从队列中读取事件并将它调度给小窗口时就会进行实际的工作。大多数应用程序逻辑是作为对用户事件的响应实现的。
基本模式是将侦听器添加至已经创建的一些小窗口。当发生相应的事件时,就会执行侦听器代码。此简单示例改编自 org.eclipse.swt.examples.helloworld.HelloWorld3。
Display display = new Display ();
Shell shell = new Shell (display);
Label label = new Label (shell, SWT.CENTER);
...
shell.addControlListener(new ControlAdapter() {
public void controlResized(ControlEvent e) {
label.setBounds (shell.getClientArea ());
}
});
对于每种类型的侦听器,都有一个接口来定义侦听器(XyzListener), 有一个类来提供事件信息(XyzEvent), 有一种 API 方法来添加侦听器(addXyzListener)。如果在侦听器接口中定义了多种方法,则会提供适配器(XyzAdapter)来实现侦听器接口并提供空方法。所有事件、侦听器和适配器都是在包 org.eclipse.swt.events 中定义的。
下表总结了可用的事件以及支持每种事件的小窗口。
事件类型 |
描述 |
小窗口 |
---|---|---|
配备 |
当配备小窗口(例如,菜单项)时生成。 |
菜单项 |
控件 |
当移动控件或者调整控件的大小时生成。 |
控件、菜单和菜单项 |
处理 |
当使用程序或者由用户来处理小窗口时生成。 |
小窗口 |
焦点 |
当控件获得或者失去焦点时生成。 |
控件 |
帮助 |
当用户请求有关小窗口的帮助时(例如,按 F1 键)生成。 |
控件、菜单和菜单项 |
键 |
当控件具有键盘焦点时,当用户在按或者释放键盘键时生成。 |
控件 |
菜单 |
当隐藏或者显示菜单时生成。 |
菜单 |
修改 |
当修改了小窗口的文本时生成。 |
CCombo、组合框、文本和 StyledText |
鼠标 |
当用户在控件上按、释放或者双击鼠标时生成。 |
控件 |
MouseMove |
当用户在控件之间移动鼠标时生成。 |
控件 |
MouseTrack |
当鼠标进入、退出或者悬浮于控件上时生成。 |
控件 |
绘制 |
当控件需要重新绘制时生成。 |
控件 |
选择 |
当用户选择控件中的项时生成。 |
按钮、CCombo、组合框、CTabFolder、列表、菜单项、窗框、范围、滚动条、滑块、StyledText、TabFolder、表、表列,表树、文本、表项和树 |
外壳程序 |
当最小化、最大化、激活、释放或关闭外壳程序时生成。 |
外壳程序 |
遍历 |
当用户使用击键来遍历控件时生成。 |
控件 |
树 |
当用户展开或折叠树中的项时生成。 |
树和表树 |
验证 |
当将要修改小窗口的文本时生成。使应用程序有机会改变文本或者阻止修改。 |
文本和 StyledText |
以上描述的定义了类型的事件是利用低级的未定义类型的小窗口事件机制来实现的。此机制并不是用来供应用程序使用的,但是您将看到它在 SWT 实现的内部使用。它还用于许多工作台向导页面实现。
未定义类型的机制依赖于常量来标识事件的类型, 并定义随此常量一起提供的类属侦听器。这允许侦听器实现“事例样式”侦听器。在以下代码片段中,我们定义了类属事件处理程序,并向外壳程序中添加了几个侦听器。
Shell shell = new Shell();
Listener listener = new Listener() {
public void handleEvent(Event e) {
switch (e.type) {
case
SWT.Resize:
System.out.println("Resize received.");
break;
case
SWT.Paint:
System.out.println(Paint received.");
break;
default:
System.out.println("Unknown event received");
}
}
});
shell.addListener(SWT.Resize, listener);
shell.addListener(SWT.Paint, listener);