一旦我们创建了显示和一些窗口小部件并启动了应用程序消息循环,真正的工作从哪里开始?每当从队列中读取事件并将它分派给窗口小部件时,实际的工作就开始了。大多数应用程序逻辑是作为对用户事件的响应实现的。
基本模式是对一些已创建的窗口小部件添加侦听器,当相应的事件发生时,将执行侦听器代码。以下简单示例改编自 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 中定义的。
下表对可用的事件以及支持每个事件的窗口小部件进行了总结。事件可以分为两个一般的类别:高级事件(代表对控件执行的逻辑操作)和低级事件(描述更特定的用户交互)。高级事件可以由多个低级事件表示,这些低级事件在每个平台上可能有所不同。低级事件通常只用于定制窗口小部件实现。
事件类型 |
描述 |
---|---|
Activate,Decativate | 在控件被激活或停用时生成。 |
Arm | 菜单项已就绪(已突出显示并可以被选择)。 |
Close | 根据窗口管理器的请求,Shell 将要关闭。 |
DefaultSelection | 用户通过调用缺省选择操作(例如,通过按 Enter 键或双击表中的一行)选择了项。 |
Dispose | 窗口小部件将被除去,这可能是通过程序执行的,也可能是由用户执行的。 |
DragDetect | 用户已启动了可能的拖动操作。 |
Expand,Collapse | 树中的项已展开或已折叠。 |
Help | 用户已请求获取窗口小部件帮助。例如,在 Windows 中,当 F1 键被按下时,将发生此事件。 |
Iconify,Deiconify | Shell 已被最小化、最大化或还原。 |
MenuDetect | 用户已请求上下文菜单。 |
Modify | 窗口小部件的文本已被修改。 |
Move,Resize | 控件已更改了位置或被调整大小,这可能是通过程序完成的,也可能是由用户完成的。 |
Selection | 用户在控件中选择了项。例如,通过单击表中的一行或通过在各个项之间进行键盘导航。 |
SetData | 使用虚拟表时,需要对 TableItem 设置数据。 |
Show,Hide | 控制的可视性已更改。 |
Traverse | 用户正在尝试使用击键离开控件。例如,使用 Escape 或 Tab 键来进行往返移动。 |
Verify | 窗口小部件的文本将被修改。此事件使应用程序有机会改变文本或者防止修改。 |
事件类型 |
描述 |
---|---|
FocusIn,FocusOut | 控件已获得或失去焦点。 |
KeyDown,KeyUp | 当控件拥有键盘焦点时,用户按下了或放开了键盘键。 |
MouseDown,MouseUp,MouseDoubleClick | 用户已在控件上按下了、释放了或双击了鼠标。 |
MouseMove | 用户已将鼠标移到控件上。 |
MouseEnter,MouseExit,MouseHover | 鼠标已进入控件、离开控件或悬浮在控件上。 |
MouseWheel | 鼠标轮子已旋转。 |
Paint | 控件已被破坏或需要重新绘制。 |
除了上面描述的事件分类系统以外,SWT 还支持低级的不分类窗口小部件事件机制。不分类机制依靠常量来标识事件类型并定义了随此常量一起提供的通用侦听器。这允许侦听器实现“实例样式”侦听器。在以下代码段中,我们定义了一个通用事件处理程序并向 shell 中添加了几个侦听器。
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);