Java 在SWT中创建多个窗口

Java 在SWT中创建多个窗口,java,swt,Java,Swt,我正在尝试创建一个窗口类,我可以使用它打开多个窗口,它将自动添加一个事件处理程序来侦听Swt.CLOSE事件,并在调用shell.dispose()方法时调用它 我的问题是: 在这种情况下,我需要监听shell.dispose(),还是只监听main方法中的display.dispose() 我需要在每个窗口各自的线程中运行,还是所有窗口都可以共享同一个UI线程?我读过一些关于在多个窗口打开的情况下与事件处理相关的错误行为的报告 我建议您应该始终拥有一个UI线程,单个Display对象在该线程上

我正在尝试创建一个
窗口
类,我可以使用它打开多个窗口,它将自动添加一个事件处理程序来侦听
Swt.CLOSE
事件,并在调用
shell.dispose()
方法时调用它

我的问题是:

  • 在这种情况下,我需要监听
    shell.dispose()
    ,还是只监听main方法中的
    display.dispose()

  • 我需要在每个窗口各自的线程中运行,还是所有窗口都可以共享同一个UI线程?我读过一些关于在多个窗口打开的情况下与事件处理相关的错误行为的报告

  • 我建议您应该始终拥有一个UI线程,单个
    Display
    对象在该线程上运行。请参阅甚至是强烈建议使用单个
    显示对象的:

    使用SWT构建的应用程序几乎总是只需要一个显示器。特别是,SWT支持的某些平台不允许多个活动显示

    甚至有几个示例应用程序(例如)可以演示SWT中的多个shell。当您想要关闭窗口时,调用
    shell.dispose()
    是一种方法

    当您关闭整个应用程序时,您应该只使用
    display.dispose()
    ,基本上是作为“最后一步”——请参见示例,或一个示例,或几乎是页面上的任何片段

    编辑

    Eclipse框架本身就是一个可以有多个窗口的应用程序的例子——它仍然使用一个
    显示
    ,带有一个UI线程和共享事件系统。对此有一个基本的解释:

    在任何GUI应用程序下面,无论其语言或UI工具包如何,操作系统平台都会检测GUI事件并将其放置在应用程序事件队列中。[…]它确定哪个窗口和应用程序应该接收每个事件,并将其放置在应用程序的事件队列中


    如果我打开了多个窗口,如果它们使用相同的显示和线程,它们是否都可以处理自己的事件导航?请参阅编辑,如果您希望禁止多个窗口同时触发事件,并且希望以模式操作,则应解决此问题,您需要使用SWT.APPLICATION_MODAL强制窗口以模态方式运行。我认为默认情况是允许每个窗口独立操作并处理自己的事件导航。