蘋(píng)果的成長(zhǎng)日記

          我還是個(gè)青蘋(píng)果呀!

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            57 隨筆 :: 0 文章 :: 74 評(píng)論 :: 0 Trackbacks
          <2005年8月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          公告

          今天我總結(jié)了嗎? 目前專(zhuān)注于: Jena推理,Rational產(chǎn)品,工作流

          常用鏈接

          留言簿(14)

          隨筆分類(lèi)(56)

          隨筆檔案(57)

          相冊(cè)

          收藏夾(1)

          三人行,必有我?guī)?/h3>

          搜索

          最新評(píng)論

          • 1.?re: Jena推理功能的展示
          • 博主,我正在做畢業(yè)設(shè)計(jì)要求一個(gè)用戶(hù)需求本體和資源本體進(jìn)行匹配,選擇出最佳資源。請(qǐng)問(wèn)這個(gè)具體要怎么做???十分著急,緊急求助
          • --李欣
          • 2.?re: 【zz至鍵行天下】java編程100例
          • 你好,我也是一個(gè)java剛?cè)腴T(mén)的學(xué)生,真誠(chéng)得希望發(fā)到我的郵箱里,我的郵箱是315309254@qq.com
          • --sad
          • 3.?re: Jena推理功能的展示
          • 同求一份資料,最近做畢業(yè)設(shè)計(jì),急需資料,網(wǎng)上找到的一些都是太理論,實(shí)踐操作性不強(qiáng),入門(mén)太難,希望大神能給一些資料。我郵箱是923395476@qq.com。感激不盡
          • --gududemao
          • 4.?re: Jena推理功能的展示
          • 你好,我最近在做jena推理,可是寫(xiě)了規(guī)則后推理后的結(jié)果卻不正確,周?chē)紱](méi)有認(rèn)識(shí)的人,博主有時(shí)間能交流一下嗎?我的qq312462753
          • --ningyh
          • 5.?re: Jena推理功能的展示
          • 樓主你好,很抱歉打擾你。我是天津大學(xué)的學(xué)生,在研究本體推理,剛接觸JENA不久,能不能把你的推理代碼發(fā)給我一份,因?yàn)閷?duì)JENA的推理還沒(méi)有弄清楚,非常感激! 120693572@qq.com
          • --劉銳光

          閱讀排行榜

          評(píng)論排行榜

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

          評(píng)論

          # re: 學(xué)習(xí)Swing的一點(diǎn)體會(huì) 2006-05-11 10:09 hhh
          就拿JTable來(lái)說(shuō),JTable就是View的部分,而TableModel就是M的部分.

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

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

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

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

          # re: 學(xué)習(xí)Swing的一點(diǎn)體會(huì) 2007-01-03 15:53 hhh[匿名]
          swing是我見(jiàn)過(guò)最優(yōu)雅和靈活的GUI框架!
          從美學(xué)來(lái)講沒(méi)有其它框架能比之!  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 平邑县| 洪江市| 柳江县| 长垣县| 英德市| 陇西县| 靖州| 虹口区| 秀山| 右玉县| 托克逊县| 兴山县| 沐川县| 台南县| 秀山| 临猗县| 乌拉特前旗| 沂水县| 商丘市| 芦山县| 开阳县| 阳信县| 兴安县| 庆云县| 泽州县| 华池县| 清新县| 定远县| 阿拉善盟| 丹凤县| 红安县| 茌平县| 拉萨市| 浦北县| 玉屏| 襄汾县| 玉山县| 成都市| 吕梁市| 德州市| 恩平市|