JavaSE6中的AWT模態增強功能
一、 引言
模態一直是我最喜歡的話題之一,至少因為一直存在大量的感興趣的客戶的有關于這方面內容的回饋信息。作為一個Java SE測試工程師,這正是驅動我工作的動力-它使我一直處于忙碌之中,而且還為我的工作帶來快樂。另一方面,這也說明了模態是客戶端最廣為使用的特征之一,不管是使用Swing還是使用AWT進行開發。
在Java SE 6(代碼名為Mustang)中,我的工作變得更有意思——在模態方面進行大量的改進。這些改進將為應用程序開發者提供更大的靈活性——在設計可能用到模態對話框行為的程序的過程中。在深入討論這些改進之前,讓我們首先看一下在Mustang之前的AWT所提供的功能。
從其有關介紹來看,AWT僅提供了兩種類型的模態:模態和非模態的。
·模態-顯示任何一個模態窗口時,應用程序中的所有窗口都將被阻斷。
·非模態的-這是一種不能阻斷任何窗口的對話框。
我們可能會提出下列一些有趣的問題:
·為什么一個模態對話框應該阻斷當前應用程序中的所有的窗口?
·如果模態對話框僅阻斷父窗口而不是其它窗口,不好嗎?
·由應用程序開發者來決定(代替AWT)在他的應用程序的對話框應該阻斷什么窗口,不好嗎?比方說,當一個模態對話框處于活動狀態時,如果一個應用程序用戶想要滾動幫助窗口來看一下他/她在對話框中作了怎樣的選擇,他/她該如何實現這一點呢?
AWT在新的Java SE 6中加強了這一方面的功能。現在,它提供了四種類型的模態(應用范圍由寬到窄):工具箱,應用程序,文檔和非模態的。開發者可以視具體需要為他的對話框選擇適當的模態類型。
二、 工具箱模態
選擇這種類型,如果:
·你的對話框必須阻斷你的應用程序中的所有窗口(除了該對話框的子層次窗口之外)
·你的對話框應該阻斷你的applet及同一個工具箱中所有其它applet
·你的對話框應該阻斷瀏覽器本身
·你想使用一個具有最大阻斷范圍的對話框
三、 應用程序模態
就通常應用程序來說,在應用程序和工具箱模態之間并不存在很多區別。但是,如果你正在開發一個applet,那么搞清其區別是十分重要的。
·如果在瀏覽器中啟動若干applet,那么,根據你使用的是什么瀏覽器(檢查你的瀏覽器文檔),它們可以被當作單獨的應用程序或單個的應用程序。應用程序模態對話框將阻斷同一個"應用程序"中的所有的窗口
·默認的模態類型,未給模態對話框指定任何內容時使用。
四、 文檔模態
選擇這種類型,如果:
·對話框只阻斷同一個文檔中的窗口("文檔"由最接近頂部的沒有所有者的窗口決定)
·對話框應該具有鄰近非模態的窗口的最小范圍的阻斷。
五、 非模態型
如果你不想要你的對話框阻斷任何窗口,那么你可以使用這種模態。
注意 既然工具箱模態對話框能夠阻斷瀏覽器/Java WebStart,那么你需要一個AWTPermission "toolkitModality"以便從一個applet中使用這種類型的模態。
總的而言,在選擇每一個對話框的適當模態類型(根據它應該阻斷應用程序中的其它頂級窗口的指定范圍)時,這為應用程序開發者提供大量的靈活性。
六、 模態排除
還有另外一種場所-在你的應用程序中存在許多窗口,并且你想要你的模態對話框阻斷除了一個窗口之外的所有其它窗口。在這樣情況下,你將必須選擇模態類型-它具有最大范圍的阻斷能力。但是,從被對話框阻斷的窗口中排除這些不應該被阻斷的窗口,有可能嗎?是的,完全可以!
下面,讓我們看一下AWT在這一方面所提供的功能:
在Java SE 6中,AWT又引入了兩種模態排除類型(參考圖1)。
(一) 阻斷工具箱模態對話框排除型
如果一個窗口是工具箱模態排除的,那么它就不會被任何應用程序或工具箱模態對話框所阻斷。另外,它也不會被文檔模態對話框從其它的子層次窗口(注意:如果你使用的是一種applet環境,那么你會要求AWTPermission-"toolkitModality"使用這種排除類型)外所阻斷。
(二) 阻斷應用程序模態對話框排除型
如果一個窗口是一個應用程序模態排除的,那么它就不會被任何應用程序模態對話框所阻斷。另外,它也不會被文檔模態對話框從其子層次窗口外面所阻斷。
默認情況下,一個窗口的模態排除屬性是被關閉的。也就是說,默認情況下,它被阻斷-如果它在可見的任何模態對話框的阻斷范圍之內。
在使用任何模態或排除類型之前,請檢查一下是否你的平臺支持這種類型-通過調用由java.awt.Toolkit類所提供方法isModalitySupported()和isModalExclusionTypeSupported()來實現。
七、 無父對話框
一直以來,對話框總是有一個父窗口與之相關聯。但是,一個對話框總是有一個父窗口真正非常有必要嗎?答案不再是這樣了!
現在,在Java SE 6中,我們有可能創建一個父窗口為"null"的AWT對話框(在對話框構造器中的"parent"參數值為null)。在以前的發行版本中,這一直會引發一個異常。
因此,如果你不想讓你的對話框有一個父窗口的話,那么你就不再需要創建一個"啞元"父窗口了!
除此之外,還有一些有趣的值得探討的內容:
(一) 如果無父對話框是文檔模態的
一個沒有所有者的文檔模態對話框會自動地成為該文檔的一個根,因此它的阻斷范圍為空。因此,它的行為就象一個非模態的對話框一樣。
(二) 如果無父對話框是應用程序或工具箱模態
一個應用程序或工具箱模態對話框(相對于一個文檔模態對話框)的阻斷范圍并不依賴于它的所有者,因此對阻斷范圍不會產生任何影響。
在任何情況下,一個模態對話框應該總是位于它阻斷的其它頂級窗口的頂部。你不能改變一個已經可見的對話框的模態類型。如果你想這樣做,那么你需要隱藏它并且再次顯示之,以便該新指定的模態類型起作用。
模態一直是我最喜歡的話題之一,至少因為一直存在大量的感興趣的客戶的有關于這方面內容的回饋信息。作為一個Java SE測試工程師,這正是驅動我工作的動力-它使我一直處于忙碌之中,而且還為我的工作帶來快樂。另一方面,這也說明了模態是客戶端最廣為使用的特征之一,不管是使用Swing還是使用AWT進行開發。
在Java SE 6(代碼名為Mustang)中,我的工作變得更有意思——在模態方面進行大量的改進。這些改進將為應用程序開發者提供更大的靈活性——在設計可能用到模態對話框行為的程序的過程中。在深入討論這些改進之前,讓我們首先看一下在Mustang之前的AWT所提供的功能。
從其有關介紹來看,AWT僅提供了兩種類型的模態:模態和非模態的。
·模態-顯示任何一個模態窗口時,應用程序中的所有窗口都將被阻斷。
·非模態的-這是一種不能阻斷任何窗口的對話框。
我們可能會提出下列一些有趣的問題:
·為什么一個模態對話框應該阻斷當前應用程序中的所有的窗口?
·如果模態對話框僅阻斷父窗口而不是其它窗口,不好嗎?
·由應用程序開發者來決定(代替AWT)在他的應用程序的對話框應該阻斷什么窗口,不好嗎?比方說,當一個模態對話框處于活動狀態時,如果一個應用程序用戶想要滾動幫助窗口來看一下他/她在對話框中作了怎樣的選擇,他/她該如何實現這一點呢?
AWT在新的Java SE 6中加強了這一方面的功能。現在,它提供了四種類型的模態(應用范圍由寬到窄):工具箱,應用程序,文檔和非模態的。開發者可以視具體需要為他的對話框選擇適當的模態類型。
二、 工具箱模態
選擇這種類型,如果:
·你的對話框必須阻斷你的應用程序中的所有窗口(除了該對話框的子層次窗口之外)
·你的對話框應該阻斷你的applet及同一個工具箱中所有其它applet
·你的對話框應該阻斷瀏覽器本身
·你想使用一個具有最大阻斷范圍的對話框
三、 應用程序模態
就通常應用程序來說,在應用程序和工具箱模態之間并不存在很多區別。但是,如果你正在開發一個applet,那么搞清其區別是十分重要的。
·如果在瀏覽器中啟動若干applet,那么,根據你使用的是什么瀏覽器(檢查你的瀏覽器文檔),它們可以被當作單獨的應用程序或單個的應用程序。應用程序模態對話框將阻斷同一個"應用程序"中的所有的窗口
·默認的模態類型,未給模態對話框指定任何內容時使用。
四、 文檔模態
選擇這種類型,如果:
·對話框只阻斷同一個文檔中的窗口("文檔"由最接近頂部的沒有所有者的窗口決定)
·對話框應該具有鄰近非模態的窗口的最小范圍的阻斷。
五、 非模態型
如果你不想要你的對話框阻斷任何窗口,那么你可以使用這種模態。
注意 既然工具箱模態對話框能夠阻斷瀏覽器/Java WebStart,那么你需要一個AWTPermission "toolkitModality"以便從一個applet中使用這種類型的模態。
總的而言,在選擇每一個對話框的適當模態類型(根據它應該阻斷應用程序中的其它頂級窗口的指定范圍)時,這為應用程序開發者提供大量的靈活性。
六、 模態排除
還有另外一種場所-在你的應用程序中存在許多窗口,并且你想要你的模態對話框阻斷除了一個窗口之外的所有其它窗口。在這樣情況下,你將必須選擇模態類型-它具有最大范圍的阻斷能力。但是,從被對話框阻斷的窗口中排除這些不應該被阻斷的窗口,有可能嗎?是的,完全可以!
下面,讓我們看一下AWT在這一方面所提供的功能:
在Java SE 6中,AWT又引入了兩種模態排除類型(參考圖1)。
(一) 阻斷工具箱模態對話框排除型
如果一個窗口是工具箱模態排除的,那么它就不會被任何應用程序或工具箱模態對話框所阻斷。另外,它也不會被文檔模態對話框從其它的子層次窗口(注意:如果你使用的是一種applet環境,那么你會要求AWTPermission-"toolkitModality"使用這種排除類型)外所阻斷。
(二) 阻斷應用程序模態對話框排除型
如果一個窗口是一個應用程序模態排除的,那么它就不會被任何應用程序模態對話框所阻斷。另外,它也不會被文檔模態對話框從其子層次窗口外面所阻斷。
![]() 圖1.排除于應用程序模態之外的窗口 |
默認情況下,一個窗口的模態排除屬性是被關閉的。也就是說,默認情況下,它被阻斷-如果它在可見的任何模態對話框的阻斷范圍之內。
在使用任何模態或排除類型之前,請檢查一下是否你的平臺支持這種類型-通過調用由java.awt.Toolkit類所提供方法isModalitySupported()和isModalExclusionTypeSupported()來實現。
七、 無父對話框
一直以來,對話框總是有一個父窗口與之相關聯。但是,一個對話框總是有一個父窗口真正非常有必要嗎?答案不再是這樣了!
現在,在Java SE 6中,我們有可能創建一個父窗口為"null"的AWT對話框(在對話框構造器中的"parent"參數值為null)。在以前的發行版本中,這一直會引發一個異常。
因此,如果你不想讓你的對話框有一個父窗口的話,那么你就不再需要創建一個"啞元"父窗口了!
除此之外,還有一些有趣的值得探討的內容:
(一) 如果無父對話框是文檔模態的
一個沒有所有者的文檔模態對話框會自動地成為該文檔的一個根,因此它的阻斷范圍為空。因此,它的行為就象一個非模態的對話框一樣。
(二) 如果無父對話框是應用程序或工具箱模態
一個應用程序或工具箱模態對話框(相對于一個文檔模態對話框)的阻斷范圍并不依賴于它的所有者,因此對阻斷范圍不會產生任何影響。
在任何情況下,一個模態對話框應該總是位于它阻斷的其它頂級窗口的頂部。你不能改變一個已經可見的對話框的模態類型。如果你想這樣做,那么你需要隱藏它并且再次顯示之,以便該新指定的模態類型起作用。
