Shell组件的"模式"样式

1. 所谓"模式"窗口, 就是指除非采取有效的关闭手段, 用户的鼠标焦点或者输入光标将一直停留在其上的窗口. 非模态窗口则不会强制此种特性, 用户可以在当前窗口以及其他窗口间进行切换.

 

2. Shell组件包含一个称做"模式"的样式, 该样式用于决定是否阻拦该Shell组件依赖的display上的其他输入. 该样式可以是SWT.APPLICATION_MODAL, SWT.MODELESS, SWT.PRIMARY_MODALSWT.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:

public class ParentAndChildDemo { public static void main(String[] args) { Display display = new Display(); Shell parentShell = new Shell(display, SWT.SHELL_TRIM | SWT.BORDER); parentShell.setText("Parent Shell"); parentShell.open(); Shell childShell = new Shell(parentShell, SWT.DIALOG_TRIM | SWT.PRIMARY_MODAL); childShell.setText("Child Shell"); childShell.open(); while (!parentShell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } }  

 

运行代码A, 可以看到它在桌面上打开两个窗口组件, 上层窗口对应childShell. 此时无法单击下层窗口, 因为对于下层窗口的所有输入都被childShell对应的窗口阻拦. 如果在上面的代码中, SWT.PRIMARY_MODAL去掉, 则这种阻拦方式也就消失了.

 

: 不同的平台对阻拦"模式"的支持有所不同. 在这种情况下, SWT会进行相应的"向上向下兼容". 比如一些操作系统就不支持SYSTEM_MODAL, 此时就会向下兼容, 使用APPLICATION_MODAL.

你可能感兴趣的:(shell,String,application,System,Class,SWT)