天天看點

MVC在Java GUI項目中具體應用(概述篇)MVC在Java GUI項目中具體應用論文摘要 1.      系統結構圖 2.      常見問題的解決

MVC在Java GUI項目中具體應用

論文摘要

n  在Java GUI項目中,程式設計或者編碼時經常會碰到一些頭疼的問題,例如需要的資料在自己需要的時候得不到,無奈增加一些靜态變量或者公共函數來取得資料,或者應該重新整理界面的時候得不到相關元件的對象等等。本來很好的設計最後被改的面目全非,甚至會被推翻了。本文提出自己總結的一個基于MVC模式的設計架構,來解決Java GUI項目中的一些常見問題。

關鍵字

Java GUI MVC

參考資料

n  《Java 設計模式》 JDK幫助文檔

1.      系統結構圖

MVC在Java GUI項目中具體應用(概述篇)MVC在Java GUI項目中具體應用論文摘要 1.      系統結構圖 2.      常見問題的解決

1.1.  模型Model

資料模型部分系統結構圖:

MVC在Java GUI項目中具體應用(概述篇)MVC在Java GUI項目中具體應用論文摘要 1.      系統結構圖 2.      常見問題的解決

模型主要包含四部分。

一、元件資料模型的注冊管理器。主要管理元件的資料模型的注冊以及在資料變化時能把及時通知資料模型。而具體的資料模型會把資料模型中的資料轉換成适合的格式。元件模型層管理器提供一系列的元件需要的資料模型。

二、資料結構的基礎操作。資料結構的一些基礎操作。基于這些基礎操作,資料操作層可以做成更複雜的功能的操作。

三、提供給程式直接調用的操作。這些操作可以分為可以可以UNDO,不可以UNDO,對UNDO沒影響的三種。

1.2.  控制Control

控制主要包括系統結構圖中的元件層的事件處理和動作指令中中的動作生成。

一、元件層的事件處理:主要是對各個元件的滑鼠事件,鍵盤事件,以及系統整理的快捷鍵的事件監聽。例如按鈕的點選事件,樹元件中節點展開事件等等,這個都需要根據使用者式樣中的規定來對應處理,随需應變。

二、動作指令層。該層中的操作比較比較好定義。一般來說,跟系統中的菜單,工具按鈕,快捷鍵是互相對應的,該層為了確定相同功能的菜單項,工具按鈕和快捷鍵能同步處理,也即菜單項,工具按鈕和快捷鍵的功能能調用同一段代碼。該功能主要參考Swing中JMenuItem和JButton使用Action對象的機制來建立的。利用這一機制,可以讓一個Action對象控制多個JMenuItem和JButton。雖然在Swing中隻能在JMenuItem和JButton中使用該機制,但是我們自己可以建立其他元件的這種機制。甚至能夠建立自己的類庫。

1.3.  視圖View

視圖主要包括元件層。包括按鈕,菜單,菜單項,文本框,文本區域,樹,表等一系列元件,也可以把簡單元件合成的複合元件,例如對話框等等。

2.      常見問題的解決

本章介紹以下功能的對應:

A.菜單條中菜單項,工具條中的按鈕和快捷鍵可用性的統一管理。

B.UNDO/REDO功能

C.LOG功能和異常管理

D.操作互斥的處理

2.1.  菜單項,按鈕和快捷鍵可用性的統一管理

XXX(内部項目)組中的成員可能都了解,在XXX(内部項目)中系統功能菜單項,按鈕以及快捷鍵的可用性都是分别對應的,也就是說都是各自獨立的,當需要設定某個功能無效時,隻能分别去設定菜單項,按鈕以及快捷鍵的可用性,相同的代碼分散在三個地方,如果再加一個相同功能的右鍵菜單呢,備援程度也就可想而知。

要實作該功能,我們可以操作Swing中Action類的功能。JMenuItem和JButton都有一個參數類型是Action的構造函數,當使用Action對象做參數建立JMenuItem和JButton對象時,可以設定JMenuItem和JButton的一些基本屬性,如現實的文字,圖示等等,還可以設定快捷鍵,最關鍵的一點是Action對象會與JMenuItem和JButton關聯,把Action設定成不可用,那麼它關聯的所有JMenuItem和JButton都變成不可用的。在Action中設定的快捷鍵還會自動綁定到系統中去。

但在這個地方需要使用工廠模式,使用一個工廠類ActionManager來確定Action對象唯一。儲存Action的最佳方法就是哈希表,哈希表的key值可以選擇Action的Class對象或者Action的類路徑。這樣又可以增加另外一個好處,就是可以在配置檔案中配置菜單條和工具條,其中就可以使用的Action的類路徑來設定JMenuItem和JButton,在建立工具條時在結合ActionManager和Java中映射就可以了。

聽來聽去,你或許會以為實作這些功能的代碼會很多,但是你錯了,這裡面有很多都是Swing給你做好的,很多都是現成的。

2.2.  UNDO/REDO功能

這個功能主要參考Microsoft Word中的undo/redo的實作方法。使用的設計模式是指令模式。資料操作層中的一個操作就是一個指令。這些指令分為可以UNDO/REDO,不可以UNDO/REDO和不影響UNDO/REDO三種。每個操作都儲存該操作進行時的參數和操作後的結果資料。

如果遇到可以UNDO/REDO的操作,則把該操作儲存在UNDO/REDO操作棧中。

如果遇到不可以UNDO/REDO的操作,則清空UNDO/REDO操作棧中的所有操作。

如果遇到不影響UNDO/REDO的操作,保持UNDO/REDO操作棧不變。

當執行UNDO指令時,從UNDO/REDO操作棧中取出前一次的操作對象并調用undo方法,當執行REDO指令時,從UNDO/REDO操作棧中取出後一次的操作對象并調用redo方法。總之遵循一個原則,誰改變的事情誰就知道該如何還原。

2.3.  LOG功能和異常管理

LOG的資訊的建立和寫入都由操作來完成,也即誰做的事情誰記錄。輸出LOG地方可以用相應的方法傳入。一個具體的操作對象自己知道該操作是否成功,該産生什麼日志,發生錯誤時該如何處理等等。明确責任到具體操作。

2.4.  操作互斥的處理

在GUI的項目中,多個操作往往可以同時執行,互相影響,繼而産生負面作用。為解決這個問題,我們需要在程式中記錄正在執行的操作,想要執行另一個操作前需要判斷它和正在執行的操作間是否互斥。而正在實行的操作我們該如何記錄,在哪裡記錄,是使用靜态變量,還是使用單例。因為操作有很多,是以如果來記錄需要的資訊至關重要。

這個正式添加操作執行管理器的重要作用。每個操作必須調用指定的方法才可以執行該操作,而我們就是用操作執行管理器去調用該方法,在操作執行管理器中記錄正在執行的操作的資訊。這樣我們使所有的操作在一個地方執行,而且要在進行驗證後再執行。這樣可以解決問題了。

此外增加操作執行管理器還有其他的作用,

(1)    記錄UNDO/REDO資訊

(2)    操作記錄LOG資訊的方法在這裡調用

(3)    其他的一些跟操作相關的功能

繼續閱讀