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

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

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

    蘋果的成長日記

    我還是個青蘋果呀!

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      57 隨筆 :: 0 文章 :: 74 評論 :: 0 Trackbacks
         從7月14日開始來上海實習已經(jīng)3個星期了,項目還沒正式開始,前期工作準備了很多,而我主要是負責GUI這塊,工具是Swing,所以陪伴Swing也已經(jīng)快一個月的日子了.項目下個星期正式啟動,所以對前面的體會作個小小的總結(jié).
        以前在inforsense公司的KDE平臺上已經(jīng)有一個Table Editor,點擊主界面上含有表格數(shù)據(jù)的節(jié)點,可以打開表格,然后可以對各種表格進行編輯,增刪等簡單操作,而同時這些操作也會反映到主界面上的工作流模型中.現(xiàn)在的目標是對這個工具進一步擴展其功能,不僅融如Excel spreadsheet的功能(過濾,對cell進行編輯等),還有將樹圖與表格視圖連接起來,可以進行兩種視圖之間的拖拽(dnd),切換等.現(xiàn)在更要與化學專業(yè)結(jié)合起來,本來這款軟件是為化學家設(shè)計的,目的使他們操作起來更方便.所以還要把擴展后的表格編輯器和Interactive Browser結(jié)合起來,做到對同一組數(shù)據(jù)的多種視圖,而且它們是同步的.比如表格中會有Structure(化學分子結(jié)構(gòu)),分子量這樣的特定的域,而點擊后可啟動特定的編輯化學分子結(jié)構(gòu)的軟件進行編輯,同時變化反映在表格數(shù)據(jù)中.
        而我接觸的都是Swing,它給我的感覺雖然好象僅僅是在AWT的類前面都加上了個J,但仔細研究,里面有各種設(shè)計模式的存在,這一點讓我興奮不已,正好借這個機會學習設(shè)計模式.我大部分時間接觸的都是JTable和JTree.所以主要談?wù)勊麄?Swing基本是就是個MVC的設(shè)計架構(gòu),就拿JTable來說,JTable就是View的部分,而TableModel就是M的部分.下面一點點講講實現(xiàn)的細節(jié):
    1.Filter(過濾器):
              要在表格中實現(xiàn)過濾的功能,而實際上不影響原來的模型,可以考慮在原來的模型增加一個過濾器.它其實上也是一個TableModel(可以子類化TableModel的實現(xiàn)框架AbstractTableModel.),它把原來的TM作為自己的成員,任何實際的操作如getColumnCount(),getRowCount(),getColumnName()等都交給原來的TM來完成(調(diào)用TM的相應(yīng)方法),只是在應(yīng)該控制的地方控制一下,比如,getValueAt(i,j)就通過控制i,j來只返回過濾器想顯示的行或列的數(shù)據(jù),而具體的返回數(shù)據(jù)的操作還是由TM來完成.對setValueAt(),isCellEditable()也是同樣的道理.我具體的做法就是用一個List把我想顯示的行(列)號保存下來,在getValueAt(i,j)中,i的取值范圍就是這個List了.這其實是一種Adapter模式的思想.同樣,實現(xiàn)Sort也可以用這種方式.
    2)Selection:
        JTable中的選擇都是由ListSelectionModel來完成的,行列都有默認的選擇模型,訪問行的SelectionModel的方式是getSelectionModel(),訪問列的SelectionModel的方式是getColumnModel().getSelectionModel().你也可以實現(xiàn)自己的選擇模型.可以通過
    getRowSelectionAllowed()和getColumnSelectionAllowed()獲取現(xiàn)在行列是否可選的信息,如果都可選,則在Cell級別是可選的.這就是為什么在行列都可選的情況下,設(shè)置i行被選中setRowSelectionInterval(i),同時設(shè)置j列被選中setColumnSelectionInterval(j),這樣只有(i,j)的Cell單元被選中得到原因.但是反過來,如果我只想使(i,j)的Cell不被選中,而僅僅靠removeColumnSelectionInterval(j)和removeRowSelectionInterval(i)是實現(xiàn)不了的.這難道是Swing的漏洞?
        前面已經(jīng)講到,設(shè)置改變選擇狀態(tài)主要是通過行列SelectionModel的setSelectionInterval(),addSelectionInterval(),removeSelectionInterval()三個方式實現(xiàn)的.
    3)header
        表的行,列的表頭著實讓我頭痛了一陣.尤其是row header.我的row header是用一個JTable實現(xiàn)的,關(guān)鍵是要和表格同步起來.可以考慮與表格共用一個Filter,關(guān)鍵是改寫getValueAt()和getRowCount()這兩個方法.這樣表格過濾留下的行也是表頭這個JTable中所需要留下的行.而選擇的同步則是覆蓋changeSelection()這個方法實現(xiàn)的.而操作的方法就是在2)中提到的那幾個方法.設(shè)置rowHeader為表頭只需要在JScrollPane中用setRowHeaderView()指定即可,而表格最左上角的單元(行表頭的表頭)用setCorner()指定.
        ColumnHeader其實在JTable中已有實現(xiàn),如果要通過單擊列頭來選擇全列的話,實現(xiàn)的方法可通過在列頭上添加一個MouseListener,然后在它的MouseClicked方法中進行選擇的同步,其余步驟與行在changeSelection()中的類似,有一點值得注意,要獲取單擊的列的索引是通過getTableHeader()后得到的tableHeader.columnAtPoint(e.getPoint())得到的,這里e是MouseEvent,也就是這個單擊的動作事件.
    具體的控制代碼如下:
    /**
      * once click on the header, that column should be selected
      */
     public void mouseClicked(MouseEvent e) {
      JTableHeader header = table.getTableHeader();
      TableColumnModel columns = header.getColumnModel();
      if(!columns.getColumnSelectionAllowed())
       return;
      //get the column index being clicked
      int column = header.columnAtPoint(e.getPoint());
      if(column == -1)
       return;
      int count = table.getRowCount();
      //set the entire column to be selected
      if(count != 0)
       table.setRowSelectionInterval(0,count-1);
      ListSelectionModel selection = columns.getSelectionModel();
      //if the shift modifier is pushed down, need to select multiple columns
      if(e.isShiftDown()) {
       int anchor = selection.getAnchorSelectionIndex();// the first index
       int lead = selection.getLeadSelectionIndex();//the last index
       
       if(anchor != -1) {
        boolean old = selection.getValueIsAdjusting();
        selection.setValueIsAdjusting(true);
        
        boolean anchorSelected = selection.isSelectedIndex(anchor);
        
        if(lead != -1) {
         if(anchorSelected)
          selection.removeSelectionInterval(anchor,lead);
         else
          selection.addSelectionInterval(anchor,lead);
        }
        
        if(anchorSelected)
         selection.addSelectionInterval(anchor,column);
        else
         selection.removeSelectionInterval(anchor,column);
        selection.setValueIsAdjusting(old);
       }
       else
        //select single column
        selection.setSelectionInterval(column,column);
       }
      else if(e.isControlDown()) {
       if(selection.isSelectedIndex(column))
        selection.removeSelectionInterval(column,column);//unselect this column
       else
        selection.setSelectionInterval(column,column);
      }
      else {
        selection.setSelectionInterval(column,column);
      }
     }
    4)dnd:
       構(gòu)造一個Transferable對象,保存?zhèn)魉偷臄?shù)據(jù).而兩方分別實現(xiàn)自己的TransferHandler即可.
    5)表示器和編輯器.
       如果想在JTree中添加JCheckbox,其實只需要實現(xiàn)自己的CellRenderer和CellEditor,在getTreeCellRendererComponent(Object value)和setTreeCellRendererComponent(Object value)中返回或設(shè)置一個JCheckBox(value.toString())即可.value就是Tree中節(jié)點node的UserObject.如果你想更改樹中顯示的文字,比如在父節(jié)點中顯示子節(jié)點的數(shù)量,只需要在TreeNode類中(子類化DefaultMutableTreeNode)改寫toString()方法即可.
       目前的代碼可以在"文件"中下載.
    posted on 2005-08-07 12:08 蘋果 閱讀(3952) 評論(5)  編輯  收藏 所屬分類: J2EE/JAVA學習

    評論

    # re: 學習Swing的一點體會 2006-05-11 10:09 hhh
    就拿JTable來說,JTable就是View的部分,而TableModel就是M的部分.

    JTable應(yīng)該是controller,負責UI的才是view,它們實現(xiàn)相應(yīng)的look and feel
    swing是一件藝術(shù)品,有著相當優(yōu)秀的架構(gòu)。
      回復(fù)  更多評論
      

    # 請教幾個問題(很急) 2006-05-16 00:59
    你寫的關(guān)于列頭選整列的方法,對我非常有幫助,謝謝!
    1 能否再寫一下點行頭選正行的方法。
    2 如何在單擊左上角的CELL 選中全部CELL
    3 如何對JTABLE 加LISTENER,當想改變?nèi)緾ELL的值的時候,謝謝!!  回復(fù)  更多評論
      

    # re: 學習Swing的一點體會 2007-01-03 15:50 hhh[匿名]
    我欣賞優(yōu)雅和一致的設(shè)計,一致性反應(yīng)了設(shè)計者極高的抽象水平,優(yōu)秀的概念表達.
      
      我們現(xiàn)在來看MFC和swing.
      MFC是如何表達GUI的,首先對于GUI元素沒有一個共性抽象,使得無法進行任意的遞歸組合.
      MFC認為 GUI元素是原子的,GUI元素自身提供了設(shè)置它屬性的API基本決定了這個GUI元素給外部定制它的能力.低靈活性!
      
      MFC認為GUI元素自身應(yīng)該處理事件,并且使用消息映射來實現(xiàn)這一點.
      所以通常如果你要處理某個GUI元素的事件,你需要寫一個繼承這個GUI元素的類.
      但殊不知很多情況下事件處理者和GUI元素是分離的!
      
      MFC的MVC是實現(xiàn)是不一致的,他并沒有將這一理念貫穿于整個框架.而只是單獨搞了個doc/view.
      
      所以如果我以今天的思路來看MFC,我覺得它對GUI的抽象是糟糕的,差勁概念表達.
      回復(fù)  更多評論
      

    # re: 學習Swing的一點體會 2007-01-03 15:51 hhh[匿名]
    而swing的組件都是四兩撥千斤,模型和繪圖都是分離的,如表格
      JTable 就有TableModel ---->JTable<-----TableUI,從結(jié)構(gòu)來說JTable完全扮演著控制器的角色.從API的使用者角度來說它是一個MVC體系的外觀,讓人想起了設(shè)計模式中的外觀模式.
      
      因為swing中一個GUI元素就是一個MVC體系,而不原子的.
      除此之外還可以為組件自定義renderer/editor.
      回復(fù)  更多評論
      

    # re: 學習Swing的一點體會 2007-01-03 15:53 hhh[匿名]
    swing是我見過最優(yōu)雅和靈活的GUI框架!
    從美學來講沒有其它框架能比之!  回復(fù)  更多評論
      

    主站蜘蛛池模板: 亚洲AV无码乱码在线观看裸奔| 日韩免费电影在线观看| 亚洲日韩一页精品发布| 你懂的网址免费国产| 国产AV无码专区亚洲AV漫画| 青青操免费在线视频| 亚洲国产一区国产亚洲 | 亚洲香蕉网久久综合影视| fc2成年免费共享视频18| 亚洲中文字幕久久精品无码喷水| 国产精品1024在线永久免费 | 一日本道a高清免费播放| 亚洲一区无码精品色| 人人揉揉香蕉大免费不卡| 亚洲麻豆精品果冻传媒| 成人免费无码大片A毛片抽搐| jzzijzzij在线观看亚洲熟妇| 亚洲国产精品自在拍在线播放| 抽搐一进一出gif免费视频| 亚洲AV无码一区二区二三区入口| **真实毛片免费观看| 亚洲伊人久久大香线蕉AV| 国产精品嫩草影院免费| 中文字幕在线免费观看视频| 亚洲国产人成网站在线电影动漫| 日韩免费一区二区三区在线| 老司机午夜性生免费福利 | 毛片网站免费在线观看| 免费国产黄网站在线观看动图| 亚洲国产精品无码久久久蜜芽 | 亚洲中文无码线在线观看| 国产男女猛烈无遮挡免费网站 | 日本亚洲视频在线| 97性无码区免费| 五月婷婷免费视频| 亚洲日本乱码一区二区在线二产线| 尤物永久免费AV无码网站| 久久精品免费观看国产| 亚洲人成自拍网站在线观看| 亚洲免费观看视频| 女人张腿给男人桶视频免费版|