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

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

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

    gr8vyguy@Blogjava

    SWT中模擬AWT的BorderLayout

    BorderLayout JFrame 的默認布局類,相信大家都用過,SWT沒有提供這個Java程序員非常熟悉的Layout類。我們怎們來自己定義一個呢?首先要稍微了解一下Layout的內部實現原理。

    borderlayout.jpg

    Layouts 是一個容器用來對其子成員布局的一個算法,符合 Strategy Design Pattern . SWT 打開一個 Composite 時,會調用 Composite 里的 layout.computeSize() 計算 Composite 的大小,然后再調 layout.layout() 設置子成員的位置和大小 . 如果需要, layout 會調用子成員的 getLayoutData() 來獲得單個子成員特別的屬性。

    computeSize()
    layout() 是抽象類 Layout 的兩個抽象方法。

    要定義一個新的 layout ,也就是要定義一個 Layout 的子類, 實現 computeSize layout. BorderLayout 來說,我們需要區分子控件是在哪個位置的 , WEST 的,還是 EAST 的,還是 CENTER 的,這個屬性通過 Control.setLayoutData() 方法保存的各個控件里。

    廢話少說了,先看源代碼

    public ? class ?BorderLayout? extends ?Layout?{
    ????
    private ?Control?north;
    ????
    private ?Control?south;
    ????
    private ?Control?east;
    ????
    private ?Control?west;
    ????
    private ?Control?center;

    ????
    protected ? void ?getControls(Composite?composite)?{
    ????????Control[]?children? = ?composite.getChildren();
    ????????
    for ?( int ?i? = ? 0 ,?n? = ?children.length;?i? < ?n;?i ++ )?{
    ????????????Control?child?
    = ?children[i];
    ????????????BorderData?borderData?
    = ?(BorderData)?child.getLayoutData();
    ????????????
    if ?(borderData? == ?BorderData.NORTH)
    ????????????????north?
    = ?child;
    ????????????
    else ? if ?(borderData? == ?BorderData.SOUTH)
    ????????????????south?
    = ?child;
    ????????????
    else ? if ?(borderData? == ?BorderData.EAST)
    ????????????????east?
    = ?child;
    ????????????
    else ? if ?(borderData? == ?BorderData.WEST)
    ????????????????west?
    = ?child;
    ????????????
    else
    ????????????????center?
    = ?child;
    ????????}
    ??? }
    }

    Control的Layout Data可以用Control.setLayoutData()方法設定, 所以getControl()方法找著各個控件的相應位置。

    ???? protected ?Point?computeSize(Composite?composite,? int ?wHint,? int ?hHint,
    ????????????
    boolean ?flushCache)?{
    ????????getControls(composite);
    ????????
    int ?width? = ? 0 ,?height? = ? 0 ;

    ????????width? += ?west? == ? null ? ? ? 0 ?:?getSize(west,?flushCache).x;
    ????????width?
    += ?east? == ? null ? ? ? 0 ?:?getSize(east,?flushCache).x;
    ????????width?
    += ?center? == ? null ? ? ? 0 ?:?getSize(center,?flushCache).x;

    ????????
    if ?(north? != ? null )?{
    ????????????Point?pt?
    = ?getSize(north,?flushCache);
    ????????????width?
    = ?Math.max(width,?pt.x);
    ????????}
    ????????
    if ?(south? != ? null )?{
    ????????????Point?pt?
    = ?getSize(south,?flushCache);
    ????????????width?
    = ?Math.max(width,?pt.x);
    ????????}

    ??????? height? += ?north? == ? null ? ? ? 0 ?:?getSize(north,?flushCache).y;
    ????????height?
    += ?south? == ? null ? ? ? 0 ?:?getSize(south,?flushCache).y;

    ????????
    int ?heightOther? = ?center? == ? null ? ? ? 0 ?:?getSize(center,?flushCache).y;
    ????????
    if ?(west? != ? null )?{
    ????????????Point?pt?
    = ?getSize(west,?flushCache);
    ????????????heightOther?
    = ?Math.max(heightOther,?pt.y);
    ????????}
    ????????
    if ?(east? != ? null )?{
    ????????????Point?pt?
    = ?getSize(east,?flushCache);
    ????????????heightOther?
    = ?Math.max(heightOther,?pt.y);
    ????????}
    ????????height?
    += ?heightOther;

    ???????? return ? new ?Point(Math.max(width,?wHint),?Math.max(height,?hHint));
    ????}

    computeSize計算Composite所需的大小。

    ???? protected ? void ?layout(Composite?composite,? boolean ?flushCache)?{
    ????????getControls(composite);
    ????????Rectangle?rect?
    = ?composite.getClientArea();
    ????????
    int ?left? = ?rect.x,?right? = ?rect.width,?top? = ?rect.y,?bottom? = ?rect.height;
    ????????
    if ?(north? != ? null )?{
    ????????????Point?pt?
    = ?getSize(north,?flushCache);
    ????????????north.setBounds(left,?top,?rect.width,?pt.y);
    ????????????top?
    += ?pt.y;
    ????????}
    ????????
    if ?(south? != ? null )?{
    ????????????Point?pt?
    = ?getSize(south,?flushCache);
    ????????????south.setBounds(left,?rect.height?
    - ?pt.y,?rect.width,?pt.y);
    ????????????bottom?
    -= ?pt.y;
    ????????}
    ????????
    if ?(east? != ? null )?{
    ????????????Point?pt?
    = ?getSize(east,?flushCache);
    ????????????east.setBounds(rect.width?
    - ?pt.x,?top,?pt.x,?(bottom? - ?top));
    ????????????right?
    -= ?pt.x;
    ????????}
    ????????
    if ?(west? != ? null )?{
    ????????????Point?pt?
    = ?getSize(west,?flushCache);
    ????????????west.setBounds(left,?top,?pt.x,?(bottom?
    - ?top));
    ????????????left?
    += ?pt.x;
    ????????}
    ????????
    if ?(center? != ? null )?{
    ????????????center.setBounds(left,?top,?(right?
    - ?left),?(bottom? - ?top));
    ????????}
    ????}

    而layout方法讓控件們各歸其位。整個布局調用是回歸的。

    完整的代碼borderlayout.rar

    上一篇

    posted on 2007-02-20 23:18 gr8vyguy 閱讀(3341) 評論(1)  編輯  收藏 所屬分類: Java

    評論

    # re: SWT中模擬AWT的BorderLayout 2007-02-22 06:06 BeanSoft

    支持一下, 最近也在苦學 SWT, 實現一個自己用的資料管理軟件, 哥們真是好人!  回復  更多評論   

    <2007年2月>
    28293031123
    45678910
    11121314151617
    18192021222324
    25262728123
    45678910

    導航

    統計

    公告

  • 轉載請注明出處.
  • msn: gr8vyguy at live.com
  • 常用鏈接

    留言簿(9)

    隨筆分類(68)

    隨筆檔案(80)

    文章分類(1)

    My Open Source Projects

    搜索

    積分與排名

    最新評論

    主站蜘蛛池模板: 2021免费日韩视频网| 在线看片免费人成视久网| 又大又黄又粗又爽的免费视频 | 一区二区在线免费观看| 亚洲AV无码精品色午夜果冻不卡| 99视频在线观看免费| 亚洲AV人无码激艳猛片| 亚洲精品免费在线| 亚洲中文字幕乱码一区| 亚洲男人的天堂www| a级精品九九九大片免费看| 亚洲产国偷V产偷V自拍色戒| 久久久久免费看黄a级试看| 亚洲精品偷拍无码不卡av| 野花高清在线观看免费3中文 | aa毛片免费全部播放完整| 国产l精品国产亚洲区在线观看| 久久青草国产免费观看| 亚洲国产成人在线视频| 日韩毛片无码永久免费看| 一个人免费观看日本www视频| 亚洲人成图片小说网站| 成人免费激情视频| 精品久久久久久久久亚洲偷窥女厕 | 久久久久亚洲AV无码去区首| 亚洲av再在线观看| 日本中文字幕免费高清视频| 亚洲天堂免费在线| 亚洲午夜精品第一区二区8050| 亚洲日本在线播放| 国产无遮挡吃胸膜奶免费看视频 | 亚洲欧洲在线播放| 四虎永久免费地址在线网站| 国产免费牲交视频免费播放 | 最近免费中文字幕大全免费版视频 | 亚洲黄色片免费看| 免费观看午夜在线欧差毛片| 99久久免费国产特黄| 91在线亚洲综合在线| 亚洲日韩中文字幕在线播放| 欧美三级在线电影免费|