<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java桌面技術

    Java Desktop Technology

    常用鏈接

    統(tǒng)計

    友情連接

    最新評論

    自定義布局管理器-CenterLayout

    上文自定義布局管理器-FormLayout介紹了FormLayout的參考實現(xiàn),利用FormLayout,通過指定left、top、

    right(可選)、bottom(可選)布局約束可以對組件進行精確定位。然而有些組件在業(yè)務上是有固定尺寸的,例如自定義組件之Button介紹的一樣,通過給按鈕指定4種狀態(tài)時的圖片,那么組件的最佳尺寸就是圖片的尺寸,因此組件的PreferredSize就可以確定,所以此時只需要組件中心的確定坐標就可以了,實際組件的Location只和其PreferredSize有關。如下圖所示:

    這就是CenterLayout的思想。

    修改FormData,只需要添加兩個變量即可。
    public final class FormData {
        public FormAttachment left;

        public FormAttachment right;

        public FormAttachment top;

        public FormAttachment bottom;

        public FormAttachment centerX;

        public FormAttachment centerY;
    }
    CenterLayout與FormLayout不同只在于addLayoutComponent、layoutContainer這兩個

    方法實現(xiàn),其他接口方法均相同,所以下面只介紹這兩個方法實現(xiàn),其他接口方法請

    參閱上文自定義布局管理器-FormLayout
    在addLayoutComponent方法的開頭,同樣是對布局約束參數(shù)constraints合法性進行檢查,這點與FormLayout大致相同。

    if (constraints == null) {
                throw new IllegalArgumentException("constraints can't be null");
            } else if (!(constraints instanceof FormData)) {
                throw new IllegalArgumentException("constraints must be a " + FormData.class.getName() + " instance");
            } else {
                synchronized (comp.getTreeLock()) {
                    FormData formData = (FormData) constraints;
                    if (formData.centerX == null || formData.centerY == null) {
                        throw new IllegalArgumentException("centerX FormAttachment and centerY FormAttachment can't be null");
                    } else if (comp.getPreferredSize() == null) {
                        throw new RuntimeException("component must have preferred size before be add into parent with CenterLayout");
                    }
                     componentConstraints.put(comp, (FormData) constraints);
                }
            }

    對于CenterLayout來說,F(xiàn)ormData對象的centerX、centerY必須給出,因為它代表,點的坐標,除此之外組件必須有PreferredSize屬性來指定組件大小。

    layoutContainer方法實現(xiàn)也大致相同
    public synchronized void layoutContainer(Container target) {
            synchronized (target.getTreeLock()) {
                int w = target.getWidth();
                int h = target.getHeight();
                Component[] components = target.getComponents();
                for (Component comp : components) {
                    FormData formData = componentConstraints.get(comp);
                    if (formData != null) {
                        ...
                    }
                }
            }
        }
    上面這步與FormLayout一樣。關鍵在if語句塊內,代碼如下:
      FormAttachment centerX = formData.centerX;
                        FormAttachment centerY = formData.centerY;
                        int width = component.getPreferredSize().width;
                        int height = component.getPreferredSize().height;
                        int x = (int) (centerX.percentage * w) + centerX.offset - width / 2;
                        int y = (int) (centerY.percentage * h) + centerY.offset - height / 2;
                        comp.setBounds(x, y, width, height);
    獲得centerX、centerY以及最佳尺寸,如上圖所示,不難得出x、y的計算方法。

    至此,自定義布局管理器就介紹到這里,這兩個布局類可以解決很多靜態(tài)布局需求,所謂靜態(tài)布局是指容器內有什么組件是固定的。如果遇到動態(tài)界面,例如組件的內容依照用戶級別、插件擴展點等因素決定,也并不是難事,因為了解了布局管理器運行機制以后可很容易地定義適合你需求的布局類。對于靜態(tài)布局來說,你可能厭倦了hard coding來布局,你希望這一切由xml這樣的配置搞定,好,下一部分則開始“壓軸戲”——用配置文件解決布局。

    posted on 2007-11-29 16:53 sun_java_studio@yahoo.com.cn(電玩) 閱讀(8234) 評論(1)  編輯  收藏 所屬分類: NetBeansGUI Design

    評論

    # re: 自定義布局管理器-CenterLayout 2008-07-01 10:57 java綜合網

    hao  回復  更多評論   

    TWaver中文社區(qū)
    主站蜘蛛池模板: 最近中文字幕2019高清免费| 一级做受视频免费是看美女| 最近免费中文字幕大全高清大全1 最近免费中文字幕mv在线电影 | 久久精品国产亚洲av水果派| 91视频免费观看| 亚洲中文字幕无码中文字在线| 成年大片免费视频播放一级 | 亚洲精品网站在线观看不卡无广告| 日韩色视频一区二区三区亚洲| 免费的涩涩视频在线播放| 亚洲精华国产精华精华液| 免费无码又爽又刺激高潮的视频| 亚洲成在人线在线播放无码| 国产日产成人免费视频在线观看| 亚洲av无码成人精品区一本二本| 精品久久洲久久久久护士免费 | 亚洲精品在线视频| a毛片全部播放免费视频完整18| 久久亚洲国产欧洲精品一| 久久免费公开视频| 亚洲日本久久一区二区va| 午夜dj免费在线观看| 污视频网站在线观看免费| 在线日韩日本国产亚洲| 免费精品无码AV片在线观看| 亚洲三级视频在线| 全黄性性激高免费视频| 日本免费A级毛一片| 亚洲的天堂av无码| 在线日韩av永久免费观看| 久久九九久精品国产免费直播| 亚洲成在人天堂一区二区| 免费一本色道久久一区| 春意影院午夜爽爽爽免费| 亚洲AV无码国产丝袜在线观看 | 免费国产在线观看老王影院| a级毛片免费播放| 精品久久久久久亚洲精品| 亚洲精品无码久久不卡| 久久精品无码专区免费东京热| 亚洲另类自拍丝袜第五页|