




已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
通過(guò)通過(guò) Java Swing 看透看透 MVC 設(shè)計(jì)模式設(shè)計(jì)模式 一個(gè)好的用戶界面 GUI 的設(shè)計(jì)通??梢栽诂F(xiàn)實(shí)世界找到相應(yīng)的表現(xiàn) 例如 如果在您的面 前擺放著一個(gè)類似于電腦鍵盤按鍵的一個(gè)簡(jiǎn)單的按鈕 然而就是 這么簡(jiǎn)單的一個(gè)按鈕 我 們就可以看出一個(gè) GUI 設(shè)計(jì)的規(guī)則 它由兩個(gè)主要的部分構(gòu)成 一部分使得它具有了按鈕 應(yīng)該具有的動(dòng)作特性 例如可以被按下 另外一 部分則負(fù)責(zé)它的表現(xiàn) 例如這個(gè)按鈕是代 表了 A 還是 B 看清楚這兩點(diǎn)你就發(fā)現(xiàn)了一個(gè)很強(qiáng)大的設(shè)計(jì)方法 這種方法鼓勵(lì)重用 reuse 而不是 重新設(shè)計(jì) redesign 你發(fā)現(xiàn)按鈕都有相同的機(jī)理 你只要在按鈕 的頂上噴上不同的字母便 能制造出 不同 的按鈕 而不用為了每個(gè)按鈕而重新設(shè)計(jì)一份圖紙 這大大減輕了設(shè)計(jì)工 作的時(shí)間和難度 如果您把上述設(shè)計(jì)思想應(yīng)用到軟件開(kāi)發(fā)領(lǐng)域 那么取得相似的效果一點(diǎn)都不讓人驚奇 一個(gè)在軟件開(kāi)發(fā)領(lǐng)域應(yīng)用的非常廣泛的技術(shù) Model View Controller MVC 便是這種思想的 一個(gè)實(shí)現(xiàn) 這當(dāng)然很不錯(cuò) 但是或許您又開(kāi)始疑惑這和 java 基礎(chǔ)類 JFC Java Foundation Class 中 的用戶界面設(shè)計(jì)部分 Swing 又有什么關(guān)系呢 好的 我來(lái)告訴你 盡管 MVC 設(shè)計(jì)模式通常是用來(lái)設(shè)計(jì)整個(gè)用戶界面 GUI 的 JFC 的設(shè)計(jì)者們卻獨(dú)創(chuàng)性 的把這種設(shè)計(jì)模式用來(lái)設(shè)計(jì) Swing 中的單個(gè)的組件 Component 例如表格 Jtable 樹(shù) Jtree 組合下拉列表框 JcomboBox 等等等等 這些組件都有一個(gè) Model 一個(gè) View 一個(gè) Controller 而且 這些 model view controller 可以獨(dú)立的改變 就是當(dāng)組件正在被使用的時(shí) 候也是如此 這種特性使得開(kāi) 發(fā) GUI 界面的工具包顯得非常的靈活 好 來(lái)吧 讓我來(lái)告訴你它是如何工作的 MVC 設(shè)計(jì)模式 就象我剛才指出的一樣 MVC 設(shè)計(jì)模式把一個(gè)軟件組件區(qū)分為三個(gè)不同的部分 model view controller Model 是代表組件狀態(tài)和低級(jí)行為的部分 它管理著自己的狀態(tài)并且處理所有對(duì)狀態(tài) 的操作 model 自己本身并不知道使用自己的 view 和 controller 是誰(shuí) 系統(tǒng)維護(hù)著它和 view 之間的關(guān)系 當(dāng) model 發(fā)生了改變系統(tǒng)還負(fù)責(zé)通知相應(yīng)的 view View 代表了管理 model 所含有的數(shù)據(jù)的一個(gè)視覺(jué)上的呈現(xiàn) 一個(gè) Model 可以有一個(gè)以 上的 View 但是 Swing 中卻很少有這樣的情況 Controller 管理著 model 和用戶之間的交互的控制 它提供了一些方法去處理當(dāng) model 的狀態(tài)發(fā)生了變化時(shí)的情況 使用鍵盤上的按鈕的例子來(lái)說(shuō)明一下 Model 就是按鈕的整個(gè)機(jī)械裝置 View Controller 就是按鈕的表面部分 下面的圖解釋了如何把一個(gè) JFC 開(kāi)發(fā)的用戶界面分為 model view controller 注意 view Controller 被合并到了一起 這是 MVC 設(shè)計(jì)模式通常的用法 它們提供了組件的用戶 界面 UI 用 Button 的例子詳細(xì)說(shuō)明 為了更好的理解 MVC 設(shè)計(jì)模式和 Swing 用戶界面組件之間的關(guān)系 讓我們更加深入 的進(jìn)行分析 我將采用最常見(jiàn)的組件 button 來(lái)說(shuō)明 我們從 model 來(lái)開(kāi)始 Model 一個(gè)按鈕的 model 所應(yīng)該具備的行為由一個(gè)接口 ButtonModel 來(lái)完成 一個(gè)按鈕 model 實(shí)例封裝了其內(nèi)部的狀態(tài) 并且定義了按鈕的行為 它的所有方法可以分為四類 1 查詢內(nèi)部狀態(tài) 2 操作內(nèi)部狀態(tài) 3 添加和刪除事件監(jiān)聽(tīng)器 4 發(fā)生事件 其他的用戶界面組件有它們各自的與組件相關(guān)的 Model 但是所有的組件 Model 都提 供這四類方法 View this buttonmodel removeActionListener buttonactionlistener buttonchangelistener null buttonactionlistener null this buttonmodel buttonmodel if this buttonmodel null buttonchangelistener new ButtonChangeListener buttonactionlistener new ButtonActionListener this buttonmodel addChangeListener buttonchangelistener this buttonmodel addActionListener buttonactionlistener updateButton public void setUI ButtonUI buttonui if this buttonui null this buttonui uninstallUI this this buttonui buttonui if this buttonui null this buttonui installUI this updateButton public void updateButton invalidate 在進(jìn)入下一節(jié)之前 你應(yīng)該多花一些時(shí)間來(lái)仔細(xì)閱讀一下 Button 類的源代碼 ButtonModel 類 ButtonModel 維護(hù)著三種類型的狀態(tài)信息 是否被按下 pressed 是否 武裝上了 armed 是否被選擇 selected 它們都是 boolean 類型的值 一個(gè)按鈕被按下 pressed 是指當(dāng)鼠標(biāo)在按鈕上面的時(shí)候 按下鼠標(biāo)但是還沒(méi)有松開(kāi) 鼠標(biāo)按鈕的狀態(tài) 及時(shí)用戶此時(shí)把鼠標(biāo)拖拽到按鈕的外面也沒(méi)有改變這種狀態(tài) 一個(gè)按鈕是否 武裝了 armed 是指按鈕被按下 并且鼠標(biāo)還在按鈕的上面 一些按鈕還可能被選擇 selected 這種狀態(tài)通過(guò)重復(fù)的點(diǎn)擊按鈕取得 true 或者 false 的值 下面的代碼是狀態(tài) pressed 的一個(gè)缺省的實(shí)現(xiàn) 狀態(tài) armed 以及 selected 實(shí)現(xiàn)的代碼與 之類似 ButtonModel 類應(yīng)該被繼承 這樣可以覆蓋缺省的狀態(tài)定義 實(shí)現(xiàn)有個(gè)性的按鈕 private boolean boolPressed false public boolean isPressed return boolPressed public void setPressed boolean boolPressed this boolPressed boolPressed fireChangeEvent new ChangeEvent button 按鈕的模型 button model 還負(fù)責(zé)通知其他對(duì)象 事件監(jiān)聽(tīng)器 它們所感興趣的事件 從下面的代買中我們可以看出當(dāng)按鈕的轉(zhuǎn)臺(tái)發(fā)生改變的時(shí)候就會(huì)發(fā)出一個(gè) ChangeEvent 下面就是代碼 private Vector vectorChangeListeners new Vector public void addChangeListener ChangeListener changelistener vectorChangeListeners addElement changelistener public void removeChangeListener ChangeListener changelistener vectorChangeListeners removeElement changelistener protected void fireChangeEvent ChangeEvent changeevent Enumeration enumeration vectorChangeListeners elements while enumeration hasMoreElements ChangeListener changelistener ChangeListener enumeration nextElement changelistener stateChanged changeevent 在進(jìn)入下一節(jié)之前 你應(yīng)該多花一些時(shí)間來(lái)仔細(xì)閱讀一下 ButtonModel 類的源代碼 ButtonUI 類 按鈕的 view controller 是負(fù)責(zé)構(gòu)建表示層的 缺省情況下它僅僅是用背景色畫(huà)一個(gè)矩 形而已 他們的子類繼承了他們并且覆蓋了繪制的方法 使得按鈕可以有許多不同的表現(xiàn) 例如 MOTIF Windows 95 Java 樣式等等 public void update Button button Graphics graphics public void paint Button button Graphics graphics Dimension dimension button getSize Color color button getBackground graphics setColor color graphics fillRect 0 0 dimension width dimension height ButtonUI 類并不自己處理 AWT 事件 他們會(huì)使用一個(gè)定制的事件監(jiān)聽(tīng)器把低級(jí)的 AWT 事件翻譯為高級(jí)的 Button 模型期望的語(yǔ)義事件 下面就是安裝 卸載事件監(jiān)聽(tīng)器的代 碼 private static ButtonUIListener buttonuilistener null public void installUI Button button button addMouseListener buttonuilistener button addMouseMotionListener buttonuilistener button addChangeListener buttonuilistener public void uninstallUI Button button button removeMouseListener buttonuilistener button removeMouseMotionListener buttonuilistener button removeChangeListener buttonuilistener View Controller 實(shí)際上就是一些方法 他們不維護(hù)任何自己的狀態(tài)信息 因此 許多 按鈕的實(shí)例可以共享一個(gè) ButtonUI 實(shí)例 ButtonUI 是通過(guò)在方面的參數(shù)列表里面加上按鈕 的引用來(lái)區(qū)分各個(gè)不同的按鈕 同樣 希望你能多花一些時(shí)間來(lái)看看 ButtonUI 類 然后咱們進(jìn)入下一節(jié) ButtonUIListener 類 ButtonUIListener 類可以幫助 Button 類去轉(zhuǎn)變鼠標(biāo)或者鍵盤的輸入為對(duì)按鈕模型的操作 這個(gè)監(jiān)聽(tīng)器類實(shí)現(xiàn)了 MouseListener MouseMotionListener ChangeListener 接口 并且處理 一下事件 public void mouseDragged MouseEvent mouseevent Button button Button mouseevent getSource ButtonModel buttonmodel button getModel if buttonmodel isPressed if button getUI contains button mouseevent getPoint buttonmodel setArmed true else buttonmodel setArmed false public void mousePressed MouseEvent mouseevent Button button Button mouseevent getSource ButtonModel buttonmodel button getModel buttonmodel setPressed true buttonmodel setArmed true public void mouseReleased MouseEvent mouseevent Button button Button mouseevent getSource ButtonModel buttonmodel button getModel buttonmodel setPressed false buttonmodel setArmed f
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鍋爐電儀施工方案
- 車間劃線、管道標(biāo)識(shí)、定置管理丨車間可視化管理大全
- 煤礦供電保護(hù)接地知識(shí)培訓(xùn)課件
- 《國(guó)際經(jīng)濟(jì)環(huán)境分析》課件
- 2024年游泳救生員壓力管理的策略及試題及答案
- 2025合同范本之銷售經(jīng)理勞動(dòng)合同
- 2024年外語(yǔ)培養(yǎng)裁判員試題及答案
- 體育經(jīng)紀(jì)人資格考試復(fù)習(xí)資料 試題及答案
- 項(xiàng)目管理專業(yè)資格考試綜合評(píng)估試題及答案
- 2025年車輛抵押借款合同模板
- (多種情景)建設(shè)工程施工合同通用條款模板
- 管理溝通與人際交往概述
- 大單元教學(xué)設(shè)計(jì) 統(tǒng)編版三年級(jí)下冊(cè)道德與法治 第二單元備課教案
- 工地工人工傷賠償協(xié)議模板合集3篇
- 2024年陜西普通高中學(xué)業(yè)水平考試通用技術(shù)試題
- 《HSK標(biāo)準(zhǔn)教程3》第1課
- 乳腺癌化療個(gè)案護(hù)理
- 眼睛的結(jié)構(gòu)和視覺(jué)系統(tǒng)
- 醫(yī)療試劑服務(wù)方案
- 2024年醫(yī)療信息安全培訓(xùn)資料
- 《廣州市城市樹(shù)木保護(hù)專章編制指引》解讀(分享版)
評(píng)論
0/150
提交評(píng)論