一旦我们创建屏幕和一些小窗口,并启动应用程序的消息循环,真正的工作从哪里开始?每当从队列中读取事件并将它调度给小窗口时就会进行实际的工作。大多数应用程序逻辑是作为对用户事件的响应实现的。
基本模式是将侦听器添加至已经创建的一些小窗口,并且当发生适当的事件时,将执行侦听器代码。此简单示例改编自 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 |
鼠标 |
当用户在控件上按、释放或者双击鼠标时生成。 |
控件 |
鼠标移动 |
当用户在控件之间移动鼠标时生成。 |
控件 |
鼠标跟踪 |
当鼠标进入、退出或者悬浮于控件上时生成。 |
控件 |
绘制 |
当控件需要重新绘制时生成。 |
控件 |
选择 |
当用户选择控件中的项时生成。 |
按钮、CCombo、组合框、CoolItem、CTabFolder、列表、菜单项、窗框、标尺、滚动条、滑块、StyledText、TabFolder、表、表光标、表列、表树、文本、工具项、树 |
Shell |
当最小化、最大化、激活、释放或关闭 shell 时生成。 |
Shell |
遍历 |
当用户使用击键来遍历控件时生成。 |
控件 |
树 |
当用户展开或折叠树中的项时生成。 |
树、表树 |
验证 |
当将要修改小窗口的文本时生成。使应用程序有机会改变文本或者防止修改。 |
文本、StyledText |
以上描述的类型化事件系统是利用低级的非类型化小窗口事件机制来实现的。此机制并不是用来供应用程序使用的,但是您将看到它在 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);