Java桌面技術(shù)

          Java Desktop Technology

          導(dǎo)航

          <2007年12月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          留言簿(25)

          隨筆分類(lèi)

          文章分類(lèi)

          隨筆檔案

          文章檔案

          相冊(cè)

          閱讀排行榜

          常用鏈接

          統(tǒng)計(jì)

          友情連接

          最新評(píng)論

          終于有時(shí)間寫(xiě)B(tài)log了

          沉默了近一個(gè)月,終于有時(shí)間寫(xiě)B(tài)log了。這些日子除了忙于工作還抽時(shí)間看Flex,發(fā)現(xiàn)ActionScript的編程思路和SWT、Swing有很多相似之處,而且語(yǔ)法也和Java很相似。總之我對(duì)Flex極為看好。今后可能要穿插地寫(xiě)些Flex的Blog了:)

          前寫(xiě)日子看留言,有人說(shuō)VB、VC的界面設(shè)計(jì)都是將界面保存成一個(gè)資源文件,這樣能完全做到界面與邏輯的分離。我從事UI設(shè)計(jì)以來(lái),用過(guò)像JBuilder、NetBeans的GUI拖拽工具,但是實(shí)現(xiàn)方式均是生成Java代碼而已,這樣不但容易造成偶合,而且工具生成的代碼往往冗長(zhǎng)。從我的項(xiàng)目經(jīng)驗(yàn)來(lái)看,UI部分大多數(shù)代碼出現(xiàn)在組件的創(chuàng)建與布局這一環(huán)節(jié),如果你使用Matisse將組件布局設(shè)置成GridBagLayout或GroupLayout,再隨便拖拽兩三個(gè)空間上去,觀察下代碼,很長(zhǎng)。而且不了解GridBagLayout和GroupLayout的非專(zhuān)業(yè)UI設(shè)計(jì)人員很難讀懂。

          “將界面保存成一個(gè)資源文件”類(lèi)似想法早就有了,一直想通過(guò)xml配置將組件生成而非hardcoding。下一篇的文章將作詳細(xì)介紹。在此之前,先解決一個(gè)bug,關(guān)于自定義布局類(lèi)FormLayout和CenterLayout。這兩個(gè)布局的preferredLayoutSize方法實(shí)現(xiàn)如下:
          public Dimension preferredLayoutSize(Container target) {
                  return target.getPreferredSize();
              }
          其實(shí)是不對(duì)的,如果這樣的話當(dāng)容器沒(méi)有設(shè)置setPreferredSize的話,運(yùn)行時(shí)會(huì)產(chǎn)生堆棧溢出錯(cuò)誤。解釋下緣由。
          java.awt.Container的getPreferredSize方法定義如下
          public Dimension getPreferredSize() {
           return preferredSize();
              }

          追蹤到preferredSize:
          @Deprecated
              public Dimension preferredSize() {
           /* Avoid grabbing the lock if a reasonable cached size value
            * is available.
            */
               Dimension dim = prefSize;
               if (dim == null || !(isPreferredSizeSet() || isValid())) {
               synchronized (getTreeLock()) {
            prefSize = (layoutMgr != null) ?
                layoutMgr.preferredLayoutSize(this) :
                super.preferredSize();
                          dim = prefSize;
                      }
           }
                  if (dim != null){
                      return new Dimension(dim);
                  }
                  else{
                      return dim;
                  }
              }
          發(fā)現(xiàn)如果prefSize為空等原因的話,可能返回布局類(lèi)的layoutMgr.preferredLayoutSize方法。所以說(shuō),如果在布局類(lèi)的preferredLayoutSize實(shí)現(xiàn)中返回容器的getPreferredSize,那么很可能陷入函數(shù)調(diào)用的循環(huán)中,最終導(dǎo)致堆棧溢出程序終止。類(lèi)似的還有minimumLayoutSize和maximumLayoutSize方法,修復(fù)的實(shí)現(xiàn)如下:
          public Dimension preferredLayoutSize(Container target) {
            target.getPreferredSize();
            synchronized (target.getTreeLock()) {
             return new Dimension(0, 0);
            }
           }

          預(yù)計(jì)周末發(fā)表《通過(guò)xml配置文件定義及布局組件》

          posted on 2007-12-25 19:13 sun_java_studio@yahoo.com.cn(電玩) 閱讀(1776) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): GUI Design

          評(píng)論

          # re: 終于有時(shí)間寫(xiě)B(tài)log了 2007-12-25 21:35 久城

          身邊有很多同事都在學(xué)習(xí)Flex,據(jù)說(shuō)很不錯(cuò),還都買(mǎi)了一本厚厚的書(shū)叫《Flex第一步》。  回復(fù)  更多評(píng)論   

          # re: 終于有時(shí)間寫(xiě)B(tài)log了 2007-12-26 09:59 ivin

          期待 電玩 放出更多的好文章啊,一直都在關(guān)注你啊!  回復(fù)  更多評(píng)論   

          TWaver中文社區(qū)
          主站蜘蛛池模板: 隆子县| 甘谷县| 苍山县| 新乡市| 温宿县| 城市| 曲松县| 新和县| 离岛区| 邓州市| 长沙市| 贵港市| 贵阳市| 双鸭山市| 易门县| 洛南县| 和龙市| 仁寿县| 毕节市| 巴中市| 德化县| 凤山市| 封开县| 阿拉善右旗| 淄博市| 牙克石市| 宜兰县| 德清县| 炉霍县| 梧州市| 海城市| 梅州市| 安西县| 玉山县| 盐边县| 三原县| 斗六市| 甘南县| 漳州市| 石城县| 无锡市|