AWT,SWT和Swing都有相似的事件監聽器
如多線程模型中所做的那樣,然而這同樣會引入在多線程模型中出現的同步問題。許多GUI工具集都有自己先天性的機制來解決這一問題,例如,在組件樹上的組合鎖。開發者不需要為如何安全編程而操心。這樣的工具集被成為線程安全的。AWT就是其中之一。
然而,由于不必要的同步使得建立這樣的GUI系統過于負責并造成了額外的開銷。因此,Swing和SWT被設計為非線程安全的,這意味著開發者必須謹慎地實現他們的多線程任務。SWT和Swing在運行時線程安全行為上有一個小小的區別。SWT總是檢查改變組件的操作是否在事件分發線程上執行。這樣,開發者就能夠發現同步問題。而Swing不這樣,這是Swing的一個不知之初,這其實并不難實現。
Event Dispatching Thread事件分發線程
AWT讀取操作系統中的基本事件并在java代碼中處理它們。AWT事件分發線程被命名為?AWT-{OS}-Thread。這個線程由AWT系統隱式啟動。當AWT應用程序啟動時,這個線程在背后啟動,在操作系統上抽取和移除事件。當諸如按鈕動作這樣的邏輯事件被觸發時,它傳遞給注冊在按鈕上的操作監聽器。開發者也能為AWT組件編寫鼠標,鍵盤和繪制事件的事件監聽器。這通常通過擴展AWT Canvas組件來完成。這一組件支持了所有已提供的事件,而且你可以通過重寫事件處理方法,實現一個自定義的組件。
然而,在Swing中,這是一個不同的線程。Swing把AWT事件作為自身事件系統的一個輸入。它獲取AWT事件并做一些初始化處理,產生一個對應的Swing事件并把它放到自己的事件隊列上。Swing也有自己的事件分發線程,通常命名為EventQueue-0。這個線程從事件隊列中抽取 Swing事件,就如同AWT從操作系統中抽取那樣。然后它把事件分發給目標組件。通常事件首先被分發給組件的頂層容器,然后由頂層容器的 dispatch方法處理,它可能被再分發或重定向到一個Swing組件,在那里繼續由自己的監聽器進行處理。
例如,當一個鼠標移過一個JButton或JFrame時,一個指向JFrame的AWT事件在AWT線程上觸發。AWT線程檢查它是否需要作更多的處理,然后把它包裝成一個Swing的MouseEvent對象并把它添加到EventQueue隊列中。當獲得MouseEvent事件后,EventQueue-0抽取這個事件并判斷出目標Swing組件。這里,這個組件是JButton。然后它產生了一個包含相對坐標位置和事件源的新的MouseEvent重定向到這個JButton上,然后調用這個 JButton的dispatch以繼續分發。JButton的dispatch過濾事件給特定的方法最終實現由鼠標監聽器在該點上的分發的點擊。
SWT更類似于AWT。唯一的區別是它要求開發者顯式地書寫事件循環代碼。然而底層的實現細節是不同于AWT的。看看SWT的讀取和分發事件代碼,它會讓你想起MFC的代碼風格。
Event Listener事件監聽器
AWT,SWT和Swing都有相似的事件監聽器模型。它們都使用觀察者模式,組件和監聽器的連接方式是把監聽器添加到組件上,這組成了一個對象網絡的模型。當事件被觸發并分發給組件,組件調用它的監聽器以處理事件。一個監聽器也可以繼續分發事件給后續的處理,或產生一個新的事件并把它廣播到網絡中的其他節點上。基本上有兩種不同的廣播事件方式。一種是同步調用監聽器。另一種是異步地將事件發送回隊列,它將在新一輪的事件分發中被分發出去。
除了直接發送給隊列的方式,Swing還有一些其他的分發異步事件的方法。其中之一是調用SwingUtilities 或EventQueue 的invokeLater,這一方法包裝一個Runnable對象到事件中并把它發送給事件隊列。這確保了Runnable的run方法能在事件分發線程上執行,保證了線程安全。實際上,Swing的Timer好SwingWorker基于這一機制實現。SWT也有相應的發送異步事件的方式。它的 invokeLater的對應方法是display.asyncExec,它以一個Runnable對象作為參數。
AWT
AWT是Sun不推薦使用的工具集。然而它在許多非桌面環境如移動或嵌入式設備中有著自己的優勢。
更少的內存。它對運行在有限環境中的GUI程序的開發,是合適的。
1.更少的啟動事件。由于AWT組件是本地由操作系統實現的。絕大多數的二進制代碼已經在如系統啟動的時候被預裝載了,這降低了它的啟動事件。
2.更好的響應。由于本地組件由操作系統渲染。
3.從java 1.x時代就為JRE支持的標準GUI工具集,你不用單獨安裝它,你不用擔心平臺差異的問題。
4.成熟穩定的。它能夠正常工作并很少使你的程序崩潰。
然而,事物都有它們不好的一面。讓我們來例數它吧。
1. 更少的組件類型。表和樹這些重要的組件缺失了。它們是桌面應用程序中普遍使用的。
2.缺乏豐富的組件特征。按鈕不支持圖片附著。這很明顯是它遵循的設計原則造成的。
3.不支持Look And Feel。AWT被設計為使用本地組件。因此,它依賴系統來提供Look And Feel支持。如果目標系統并不支持這一特性,那么AWT將無法改變它的Look And Feel。
4.無擴展性。AWT的組件是本地組件。JVM中的AWT類實例實際只是包含本地組件的引用。唯一的擴展點是AWT的Canvas組件,你可以從零開始創建自定義組件。然而無法繼承和重用一個已有的AWT組件。
SWT
SWT有如下優勢:
1.豐富的組件類型。SWT提供了種類繁多的組件,從基礎組件如按鈕和標簽到高級的表格和樹。
2.相對的豐富組件特性。盡管SWT也遵循最大公倍數原則,它采用模擬的方式重新設計了對更多組件特性的支持。所以同AWT相比,它有著相對豐富的組件特性。
3.更快的響應時間。基于和AWT同樣的原因,SWT組件包裝了本地組件,由操作系統實現渲染。操作系統通常對渲染處理做了優化,保存GUI二進制代碼為標準庫,減少了內存的使用,提高了響應性能。
4.更少的內存消耗。既然操作系統為本地組件提供了優化,這一點就容易理解了。
以上就是AWT,SWT和Swing都有相似的事件監聽器的內容。
【編輯推薦】