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