




已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
通過通過 Java Swing 看透看透 MVC 設計模式設計模式 一個好的用戶界面 GUI 的設計通??梢栽诂F(xiàn)實世界找到相應的表現(xiàn) 例如 如果在您的面 前擺放著一個類似于電腦鍵盤按鍵的一個簡單的按鈕 然而就是 這么簡單的一個按鈕 我 們就可以看出一個 GUI 設計的規(guī)則 它由兩個主要的部分構成 一部分使得它具有了按鈕 應該具有的動作特性 例如可以被按下 另外一 部分則負責它的表現(xiàn) 例如這個按鈕是代 表了 A 還是 B 看清楚這兩點你就發(fā)現(xiàn)了一個很強大的設計方法 這種方法鼓勵重用 reuse 而不是 重新設計 redesign 你發(fā)現(xiàn)按鈕都有相同的機理 你只要在按鈕 的頂上噴上不同的字母便 能制造出 不同 的按鈕 而不用為了每個按鈕而重新設計一份圖紙 這大大減輕了設計工 作的時間和難度 如果您把上述設計思想應用到軟件開發(fā)領域 那么取得相似的效果一點都不讓人驚奇 一個在軟件開發(fā)領域應用的非常廣泛的技術 Model View Controller MVC 便是這種思想的 一個實現(xiàn) 這當然很不錯 但是或許您又開始疑惑這和 java 基礎類 JFC Java Foundation Class 中 的用戶界面設計部分 Swing 又有什么關系呢 好的 我來告訴你 盡管 MVC 設計模式通常是用來設計整個用戶界面 GUI 的 JFC 的設計者們卻獨創(chuàng)性 的把這種設計模式用來設計 Swing 中的單個的組件 Component 例如表格 Jtable 樹 Jtree 組合下拉列表框 JcomboBox 等等等等 這些組件都有一個 Model 一個 View 一個 Controller 而且 這些 model view controller 可以獨立的改變 就是當組件正在被使用的時 候也是如此 這種特性使得開 發(fā) GUI 界面的工具包顯得非常的靈活 好 來吧 讓我來告訴你它是如何工作的 MVC 設計模式 就象我剛才指出的一樣 MVC 設計模式把一個軟件組件區(qū)分為三個不同的部分 model view controller Model 是代表組件狀態(tài)和低級行為的部分 它管理著自己的狀態(tài)并且處理所有對狀態(tài) 的操作 model 自己本身并不知道使用自己的 view 和 controller 是誰 系統(tǒng)維護著它和 view 之間的關系 當 model 發(fā)生了改變系統(tǒng)還負責通知相應的 view View 代表了管理 model 所含有的數(shù)據(jù)的一個視覺上的呈現(xiàn) 一個 Model 可以有一個以 上的 View 但是 Swing 中卻很少有這樣的情況 Controller 管理著 model 和用戶之間的交互的控制 它提供了一些方法去處理當 model 的狀態(tài)發(fā)生了變化時的情況 使用鍵盤上的按鈕的例子來說明一下 Model 就是按鈕的整個機械裝置 View Controller 就是按鈕的表面部分 下面的圖解釋了如何把一個 JFC 開發(fā)的用戶界面分為 model view controller 注意 view Controller 被合并到了一起 這是 MVC 設計模式通常的用法 它們提供了組件的用戶 界面 UI 用 Button 的例子詳細說明 為了更好的理解 MVC 設計模式和 Swing 用戶界面組件之間的關系 讓我們更加深入 的進行分析 我將采用最常見的組件 button 來說明 我們從 model 來開始 Model 一個按鈕的 model 所應該具備的行為由一個接口 ButtonModel 來完成 一個按鈕 model 實例封裝了其內(nèi)部的狀態(tài) 并且定義了按鈕的行為 它的所有方法可以分為四類 1 查詢內(nèi)部狀態(tài) 2 操作內(nèi)部狀態(tài) 3 添加和刪除事件監(jiān)聽器 4 發(fā)生事件 其他的用戶界面組件有它們各自的與組件相關的 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 在進入下一節(jié)之前 你應該多花一些時間來仔細閱讀一下 Button 類的源代碼 ButtonModel 類 ButtonModel 維護著三種類型的狀態(tài)信息 是否被按下 pressed 是否 武裝上了 armed 是否被選擇 selected 它們都是 boolean 類型的值 一個按鈕被按下 pressed 是指當鼠標在按鈕上面的時候 按下鼠標但是還沒有松開 鼠標按鈕的狀態(tài) 及時用戶此時把鼠標拖拽到按鈕的外面也沒有改變這種狀態(tài) 一個按鈕是否 武裝了 armed 是指按鈕被按下 并且鼠標還在按鈕的上面 一些按鈕還可能被選擇 selected 這種狀態(tài)通過重復的點擊按鈕取得 true 或者 false 的值 下面的代碼是狀態(tài) pressed 的一個缺省的實現(xiàn) 狀態(tài) armed 以及 selected 實現(xiàn)的代碼與 之類似 ButtonModel 類應該被繼承 這樣可以覆蓋缺省的狀態(tài)定義 實現(xiàn)有個性的按鈕 private boolean boolPressed false public boolean isPressed return boolPressed public void setPressed boolean boolPressed this boolPressed boolPressed fireChangeEvent new ChangeEvent button 按鈕的模型 button model 還負責通知其他對象 事件監(jiān)聽器 它們所感興趣的事件 從下面的代買中我們可以看出當按鈕的轉臺發(fā)生改變的時候就會發(fā)出一個 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 在進入下一節(jié)之前 你應該多花一些時間來仔細閱讀一下 ButtonModel 類的源代碼 ButtonUI 類 按鈕的 view controller 是負責構建表示層的 缺省情況下它僅僅是用背景色畫一個矩 形而已 他們的子類繼承了他們并且覆蓋了繪制的方法 使得按鈕可以有許多不同的表現(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 事件 他們會使用一個定制的事件監(jiān)聽器把低級的 AWT 事件翻譯為高級的 Button 模型期望的語義事件 下面就是安裝 卸載事件監(jiān)聽器的代 碼 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 實際上就是一些方法 他們不維護任何自己的狀態(tài)信息 因此 許多 按鈕的實例可以共享一個 ButtonUI 實例 ButtonUI 是通過在方面的參數(shù)列表里面加上按鈕 的引用來區(qū)分各個不同的按鈕 同樣 希望你能多花一些時間來看看 ButtonUI 類 然后咱們進入下一節(jié) ButtonUIListener 類 ButtonUIListener 類可以幫助 Button 類去轉變鼠標或者鍵盤的輸入為對按鈕模型的操作 這個監(jiān)聽器類實現(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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 育嬰大賽模擬題(附答案)
- 工業(yè)分析與檢驗模擬練習題+答案
- 衛(wèi)生學模擬考試題(附參考答案)
- 手機拍攝培訓課程
- 校本培訓活動記錄表
- 【初中語文】《賣油翁》課件-2024-2025學年統(tǒng)編版語文七年級下冊
- epc工程廉政合同范例
- 2025年多功能地熱井口裝置項目合作計劃書
- 中糧配額合同范例
- 企業(yè)公司聘用合同范例
- 2025中國遠洋海運集團校園招聘1484人筆試參考題庫附帶答案詳解
- 2025年安徽商貿(mào)職業(yè)技術學院單招職業(yè)技能考試題庫一套
- 2025年皖西衛(wèi)生職業(yè)學院單招職業(yè)技能測試題庫審定版
- 2025年河南經(jīng)貿(mào)職業(yè)學院單招職業(yè)適應性測試題庫帶答案
- unctad -全球投資趨勢監(jiān)測 第 48 期 Global Investment Trends Monitor,No. 48
- 2025年浙江機電職業(yè)技術學院高職單招職業(yè)技能測試近5年常考版參考題庫含答案解析
- GA/T 2145-2024法庭科學涉火案件物證檢驗實驗室建設技術規(guī)范
- 2025年聚焦全國兩會知識競賽題庫及答案(共100題)
- 2024智能網(wǎng)聯(lián)汽車零部件行業(yè)研究報告-2025-01-智能網(wǎng)聯(lián)
- 2025年中國融通資產(chǎn)管理集團限公司春季招聘(511人)高頻重點提升(共500題)附帶答案詳解
- 急性心肌梗死的急救與護理
評論
0/150
提交評論