Swing慢不慢?

這個問題很籠統,爲什麼大多數程序員初次接觸到Swing後,有的甚至是別的領域如Windows Forms的專家,都有這種感覺,一些熟悉Swing框架的人可能認爲Swing一點也不慢。

這涉及到了Swing單線程設計的問題,這個問題是老生常談,相信不少同學已經熟悉,現在使用JDK1.6提供的SwingWorker大體能解決這部分問題,如果有同學批評Swing很慢,界面很簡陋,會引起板磚無數,當然,對於熟悉Swing的專家來說,在程序設計中,長時間任務都通過SwingWorker通過後臺線程處理,這是顯而易見的,在我看來,對Swing的批評其實涉及到一個關於框架設計的原則問題,使用一個框架時一個簡單的任務如果需要非常複雜的方法來實現,這個框架對用戶來講就不是非常友好的,Swing控件的所有方法都必須在EDT中調用,這就表明必須使用SwingWorker這樣的機制,如果您直接開個Thread,所有的對界面元素的修改代碼都必須使用SwingUtilities.invokeLater,這也是爲什麼SwingWorker存在的原因,而JavaME就可以直接在線程中調用GUI控件的方法。

Swing的單線程問題除了增加程序員的負擔之外,還帶來了副作用,如果仔細閱讀Swing基礎控件的源代碼,就會更深刻的明白這個道理,Swing控件的界面庫除了繪製例程之外,所有的其他例程,包括界面佈局,文檔內容修改,GUI事件都運行在EDT中,這就客觀造成了大型Swing控件比方說JEditorPane打開網頁時非常慢,因爲對一個複雜的網頁來說,有大量的標籤需要生成,佈局,計算,繪製,這就造成了GUI凍結,這時候SwingWorker就派不上用場了,這也可能是Swing個別控件本身設計的缺陷,即使使用SwingWorker將其中的一部分例程抽出來也非常難!

另外一個能夠顯著影響Swing界面程序的問題是大量的匿名內部類,前邊提到,目前的Java語言還沒有什麼好辦法來替代匿名內部類,只有新的Java Closure提議瞭解決單個方法接口的問題,而對於事件類型的匿名內部類沒有好的解決辦法,其實使用Swing開發桌面程序應該儘量避免生成大量的事件匿名內部類,應該將多個事件接口合併到一個內部類中,這也是Swing底層控件修改的原因,包括NetBeans IDE自動生成的方法也從原先的匿名內部來改成了新的單個類實現,Java的所有類包括匿名類,嵌套類都是單獨的一個文件,針對大型的程序,如果有上千個Action,加載起來就非常慢,應該使用一個或者多個類,通過將Action對應到具體的方法來實現!

總之,批評Swing慢的同學也是有道理的,很簡單的一個例子,同時打開微軟的開發工具Visual Studio和NetBeans IDE,再打開項目和文件,就可明顯感覺到差別,我個人也使用Visual Studio做過一段時間的C#開發,我的觀點是Swing框架本身還是有一定缺陷的,當然這些缺陷有的可通過一些方法進行改善,有些就比較難,我們也在做一些研究,嘗試着在新的控件中做一些改變!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章