1. 所谓"模式"窗口, 就是指除非采取有效的关闭手段, 用户的鼠标焦点或者输入光标将一直停留在其上的窗口. 非模态窗口则不会强制此种特性, 用户可以在当前窗口以及其他窗口间进行切换.
2. Shell组件包含一个称做"模式"的样式, 该样式用于决定是否阻拦该Shell组件依赖的display上的其他输入. 该样式可以是SWT.APPLICATION_MODAL, SWT.MODELESS, SWT.PRIMARY_MODAL或SWT.SYSTEM_MODAL. SWT.PRIMARY_MODAL样式允许Shell组件阻拦对其父组件的输入; SWT.APPLICATION_MODAL样式阻拦Shell组件依赖的display上的所有其他Shell组件的输入; 样式SYSTEM_MODAL样式阻拦当前系统中所有的向Shell组件的输入.
代码A是使用"模式"样式的一个例子. 在这段代码中, 创建完parentShell对象之后, 以parentShell为父亲组件, 创建了一个称为childShell的窗口组件. 根据上文对构造函数的介绍, childShell也依赖于display对象. 同时, 当parentShell释放时, childShell也会得到释放. childShell的样式包含两个组合, 前一个决定了childShell外观样式, 后一个决定了childShell对输入事件的阻拦机制.
代码A:
运行代码A, 可以看到它在桌面上打开两个窗口组件, 上层窗口对应childShell. 此时无法单击下层窗口, 因为对于下层窗口的所有输入都被childShell对应的窗口阻拦. 如果在上面的代码中, 将SWT.PRIMARY_MODAL去掉, 则这种阻拦方式也就消失了.
注: 不同的平台对阻拦"模式"的支持有所不同. 在这种情况下, SWT会进行相应的"向上向下兼容". 比如一些操作系统就不支持SYSTEM_MODAL, 此时就会向下兼容, 使用APPLICATION_MODAL.