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

          導航

          統計

          公告

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

          留言簿(9)

          隨筆分類(68)

          隨筆檔案(80)

          文章分類(1)

          My Open Source Projects

          搜索

          積分與排名

          最新評論

          主站蜘蛛池模板: 丽水市| 固镇县| 安福县| 齐齐哈尔市| 永平县| 花莲市| 柏乡县| 方山县| 阿拉尔市| 平南县| 剑河县| 佳木斯市| 凌海市| 合山市| 辉南县| 九龙坡区| 仙游县| 竹北市| 集贤县| 合江县| 酒泉市| 正蓝旗| 建德市| 聂拉木县| 前郭尔| 迁安市| 乐平市| 翁源县| 汉阴县| 宁陕县| 城固县| 措勤县| 岳池县| 元阳县| 荃湾区| 威远县| 太仓市| 昌江| 东兰县| 汾西县| 错那县|