此处的讨论,是基于单UI线程的,也就是说只有一个Display实例。
如何创建一个Shell
需要注意,Shell是基于一个Display存在的。
1. new Shell()
【独立】内部使用Display.getDefault()获得一个dispaly,然后创建一个Shell。
2. new Shell(Display display)
【独立】使用传入的Display来创建一个Shell,通常情况下程序只有一个Display。
3. new Shell(Shell parent)
【父子关系】使用传入Shell的display创建一个Shell,内部parent变量会保存传入的shell。只有这种情况下SWT.PRIMARY_MODAL才有用。
总结
使用方法3创建Shell,如果有多个窗体,可以控制局部Parent shell不可点击。使用APPLICATION_MODAL对于上述三种情况,都可以让当前窗体模态化。
窗体的Modal级别
模态窗体,是指当前打开的窗体,是否会阻塞其它的窗体。SWT中的窗体可以是一个打开的Shell,Dialog或者MessageBox。
1. SWT.PRIMARY_MODAL
【仅限方式三】当使用父窗体shell构建shell时,父窗体不能点击,直到当前窗体关闭。但是其它Window是可以点击的。
注意:
如果Dialog使用的是新创建的一个Shell,则PRIMARY_MODAL不起作用。
2. SWT.APPLICATION_MODAL
【所有shell】比PRIMARY_MODAL更严格,当前程序的所有窗口都不能点击了,直到当前窗体关闭。
3. SWT.SYSTEM_MODAL
【所有shell】比APPLICATION_MODAL更严格,整个操作系统被阻塞,除了当前窗体,其它都不能点击。
注意:
SYSTEM_MODAL在Windows和Linux中都已经不再支持,因为其会冻结整个desktop。如果使用,其会自动降为APPLICATION_MODAL。