Posted on 2009-07-08 22:49
zht 閱讀(2758)
評論(1) 編輯 收藏 所屬分類:
Swing
一直想寫篇關于Swing體系結構的文章,不過一直不敢下手,怕理解的有偏差,最近看了下這方面的資料,記錄下,Swing的整體組織結構如下圖所示。

Swing程序要呈現出來,肯定要將組件放到JFrame,JDialog,JApplet,JWindow這幾個容器組件中,這些頂層容器組件,有一個共同的結構,如上圖所示,都有一個JRootPane面板來承載著所有要顯示的組件。JRootPane又有以下部分組成:
1、GlassPane
2、JLayeredPane
(1)ContentPane
(2)JMenuBar
其中JRootPanel中的RootLayout對以上幾部分進行布局,關于這點可以參考Java的API文檔和java源碼,里面有詳細的說明。
這里想要說的一點是,JRootPane并不是只能放在這些頂層容器中的,你也可以放在一般的組件,比如JPanel中,這樣Panel就有了層次結構,可以再其不同的層次上放置組件,這個后邊還會再講一下。
寫這篇文章,并不是為了講Swing的這個架構,主要是想通過講述這個架構,給大家介紹些開發過程中用的技巧。
GlassPanel這個可能大家都了解了,比如,可以模擬Eclipse中Tab頁簽的拖拽效果,當處理一些比較費時的操作,比如加載數據時,可以用來遮罩面板,一方面可以防止用戶重復操作,另一方面可以用來顯示進度。不過有一點限制就是每個頂層容器中GlassPanel只能有一個(其實像上面提到的,如果一個面板中的組件都有一個JRootPane來承載組件,其實在一個程序中GlassPane也是可以有多個的,通過這個,GlassPanel和JLayeredPane幾乎可以達到相同的效果)。
JLayeredPane有了深度的概念,一般的Layout在JLayeredPane是不適用的。一個Integer來標示組件在JLayeredPane中的深度,這個值越大,就會顯示在越上面。JLayeredPane還有一個同層的上下關系,這個可以參考API或者源代碼。重要的一點是JLayeredPane默認的Layout是null,所以,放到JLayeredPane上的組件,必須要通過setBounds的形式來設置大小才會顯示出來,否則是看不到的,這點尤其要注意。JLayeredPane的層次結構能實現非常多的特效,我甚至認為,JLayeredPane 是Swing結構中,最精妙的設計之一,通過JLayeredPane我們可以實現文本的驗證提示功能,舉個例子,有一個文本框,用來輸入電話號碼,有時候可能用戶會輸入些字母,甚至是漢字,當用戶切換到下一個面板或者最后提交驗證以后,你可能希望給出一些提示來標明這些輸入非法,這時候,就可以用到JLayeredPane了,你可以將非法輸入的組件,傳遞給一個Panel,這個Panel在非法的組件旁邊繪制一個小圖標,然后讓這個Panel顯示在主界面的上面(后續會把相關代碼發出)。還有另外一個用途就是使用JInternalFrame做控制面板,可以通過JLayeredPane將一個JInternalFrame懸浮到一個面板中,既不會占用程序的空間,又不會像dialog那樣,必須要彈出來才可以。
附一個通過LayeredPane來顯示加載進度的例子,使用方法很簡單只需要將你的組件通過我的adapter封裝下,然后再放到你的程序中即可MaskAdapter maskPanel = MaskAdapter.getMaskpanel(panel, false);。
下載
