Swing


          天行健 君子以自強不息

          posts - 69, comments - 215, trackbacks - 0, articles - 16
             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Swing DayDayUP之三:Swing組件層次結(jié)構(gòu)介紹

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

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

                   附一個通過LayeredPane來顯示加載進度的例子,使用方法很簡單只需要將你的組件通過我的adapter封裝下,然后再放到你的程序中即可MaskAdapter maskPanel = MaskAdapter.getMaskpanel(panel, false);。
          下載

          主站蜘蛛池模板: 宁强县| 邢台县| 色达县| 太仆寺旗| 扬州市| 望都县| 汉源县| 林西县| 安义县| 宝鸡市| 图木舒克市| 边坝县| 盐津县| 阿勒泰市| 邢台市| 宜黄县| 依安县| 衡山县| 莲花县| 黄浦区| 哈密市| 遂宁市| 富蕴县| 麻栗坡县| 钦州市| 大连市| 岚皋县| 兰溪市| 富蕴县| 长丰县| 南溪县| 安达市| 耒阳市| 察隅县| 黑河市| 昌邑市| 柘城县| 保靖县| 大英县| 长沙县| 阳江市|