我正在尝试创建一个Window可用于打开多个窗口的类,它将自动添加一个事件处理程序来侦听Swt.CLOSE事件,并在调用该shell.dispose()方法时调用该方法。
我的问题是:
shell.dispose()在这种情况下我需要监听,还是只display.dispose()在我的主要方法中监听?
我需要在自己的线程中运行每个窗口,还是所有窗口都可以共享同一个 UI 线程?我已经阅读了一些关于在打开多个窗口的情况下与事件处理相关的错误行为的报告。
我建议您应该始终有一个 UI 线程,单个Display对象在该线程上运行。请参阅SWT: single vs. multiple display甚至强烈建议使用单个Display对象的Display 上的Eclipse 文档:
使用 SWT 构建的应用程序几乎总是只需要一个显示器。特别是,SWT 支持的一些平台不允许多于一个活动显示。
甚至还有几个可用的示例应用程序(例如这个)在 SWT 中演示了多个 shell。shell.dispose()当你想关闭一个窗口时调用是要走的路。
您应该只display.dispose()在关闭整个应用程序时使用,基本上是作为“最后一步” - 请参阅此示例或此示例,或SWT 代码段页面上的几乎任何代码段。
编辑
Eclipse 框架本身就是一个可以有多个窗口的应用程序示例——它仍然使用单个Display、具有单个 UI 线程和共享事件系统。关于线程问题的 Eclipse 文档对此有一个基本解释:
在任何 GUI 应用程序之下,无论其语言或 UI 工具包如何,操作系统平台都会检测 GUI 事件并将它们放置在应用程序事件队列中。[...] 它确定哪个窗口和应用程序应该接收每个事件并将其放置在应用程序的事件队列中。