TableModelExample可以簡(jiǎn)化Swing
每篇關(guān)于 GUI 編程的文章都需要一個(gè)示例,本文當(dāng)然也不例外。該示例的目的是指出使用 TMF 框架代替?zhèn)鹘y(tǒng) TableModel 設(shè)計(jì)的主要優(yōu)勢(shì)所在。示例中的應(yīng)用程序?qū)⒃谄聊簧巷@示多個(gè)表,并且可以添加或刪除表,表中可以包含不同類型的信息( String 類型、 int 類型、 Boolean 類型和 BigDecimal 類型),而且最重要的是,其中還包含可配置的列信息,必須定期更改它們。
示例應(yīng)用程序的代碼從 J2X 包中分離了出來,您可以 HR 文件夾的 src 目錄中找到源代碼。還可以雙擊 build/lib 文件中編譯好的 JAR 文件,通過 JRE 運(yùn)行應(yīng)用程序。
在示例應(yīng)用程序中,有兩個(gè)類可以相互交換,一個(gè)叫作 TableModelFreeExample ,另一個(gè)叫作 TableModelExample 。這兩個(gè)類在應(yīng)用程序中做的是同樣的事,使應(yīng)用程序產(chǎn)生的行為也相同。但是,它們的設(shè)計(jì)不同,一個(gè)使用的是 TMF 框架,另外一個(gè)則使用傳統(tǒng)的 TableModel。您從它們身上注意到的***件事可能是 TMF 類 TableModelFreeExample ,該類由 63 行代碼構(gòu)成,而在傳統(tǒng) TableModel 版本 TableModelExample 中,它長達(dá) 285 行。
Evil HR Director 應(yīng)用程序
我要使用的示例應(yīng)用程序是 Evil HR Director 應(yīng)用程序,它允許人力資源總監(jiān)(可能很可怕,戴著眼鏡)在 JTable 中查看潛在雇員的列表,然后從表中選出雇傭的人。新雇傭的員工的資料會(huì)轉(zhuǎn)移到當(dāng)前雇員使用的兩個(gè) JTable 中;其中一個(gè)表包含個(gè)人信息,另外一個(gè)表包含財(cái)務(wù)信息。在當(dāng)前雇員表中,總監(jiān)可以隨意選擇解雇誰。您可以在圖 1 中看到該應(yīng)用程序的 UI。
圖 1. Evil HR Director 應(yīng)用程序
為了進(jìn)一步證明 TMF 框架的簡(jiǎn)單性,請(qǐng)看清單 6。這個(gè)清單只包含三行必需的代碼,就可以創(chuàng)建 Evil HR Director 應(yīng)用程序中包含的三個(gè)表的模型。這些代碼可以在 TableModelFreeExample 中找到。
清單 1.在 Evil HR Director 應(yīng)用程序中創(chuàng)建模型所需要的代碼
- TableUtilities.setViewToModel("demo/hr/resources/evil_hr_table.xml",
- "Hire", hireTable, candidates);
- TableUtilities.setViewToModel("demo/hr/resources/evil_hr_table.xml",
- "Personal", personalTable, employees);
- TableUtilities.setViewToModel("demo/hr/resources/evil_hr_table.xml",
- "Financial", financialTable, employees);
為了進(jìn)行比較, TableModelExample 中包含用傳統(tǒng) TableModel 方法為三個(gè)表格創(chuàng)建模型所需要的代碼。請(qǐng)查看示例包中的代碼。不過,我不想在這里列出所有代碼,因?yàn)樗阕阌?205 行!
演示 TMF 框架的靈活性
TMF 框架的巨大優(yōu)勢(shì)之一,是它能更加容易地基于 JTable 的應(yīng)用程序在其發(fā)布之后進(jìn)行修改。為了證實(shí)這一點(diǎn),讓我們來看兩個(gè)可能的場(chǎng)景,這兩個(gè)場(chǎng)景在使用 Evil HR Director 應(yīng)用程序中每天都可能出現(xiàn)。在每個(gè)場(chǎng)景中,您都會(huì)看到框架是如何讓應(yīng)用程序更加容易地適應(yīng)不斷變化的用戶需求。
場(chǎng)景 1:公司的策略發(fā)生變化,規(guī)定在公司的應(yīng)用程序中查看私人的婚姻信息是非法的。
TMF:最終用戶需要從 XML 配置文件中刪除 Married?married 。
傳統(tǒng) TableModel:開發(fā)人員必須深入研究 Java 代碼,修改 getColumnName() ,讓它無法返回列名“Married?”;修改 getColumnCount() ,讓它返回的結(jié)果比以前返回的結(jié)果少一列;修改 getValueAt() ,不讓它返回 isMarried() 。然后開發(fā)人員必須重新編譯 Java 代碼,并重新部署應(yīng)用程序。
場(chǎng)景 2:公司策略發(fā)生變化,公司覺得有必要在潛在雇員表中包含居住地所在的州的信息。
TMF:: 最終用戶需要將 Statestate 添加到 XML 配置文件中。
傳統(tǒng) TableModel:開發(fā)人員必須深入研究 Java 代碼,修改 getColumnName() ,添加一個(gè)叫作 “State” 新列;修改 getColumnCount() ,讓它返回的列數(shù)加 1 ;修改 getValueAt() ,讓它返回 getState() 。然后開發(fā)人員必須重新編譯 Java 代碼,并重新部署應(yīng)用程序。
您可以看到,當(dāng)應(yīng)用程序中的表發(fā)生變化時(shí)(尤其在碰到一個(gè)總是朝令夕改的老板時(shí),更改更加頻繁),編輯 XML 文件要比重新部署整個(gè)應(yīng)用程序容易得多。
使用代碼
在您飛奔過去刪除所有 TableModel 代碼之前,我想我還得占用您一分鐘解釋一下 j2x.zip 文件的內(nèi)容,以及您怎樣才能在您自己的項(xiàng)目中使用它。(請(qǐng)記住,特定于 TMF 的代碼可以在 com.ibm.j2x.swing.table 包中找到;您還會(huì)在 J2X 包中找到我在以前的文章“Go state-of-the-art with IFrame.”中介紹的其他代碼。)
j2x.zip 文件包含兩上文件夾:
src—— 包含本文中使用的源代碼。在 src 文件夾中,還有兩個(gè)文件夾:一個(gè)是 HR,包含構(gòu)成 Evil HR Director 應(yīng)用程序的源代碼;另一個(gè)是 J2X,包含 J2X 項(xiàng)目中使用的所有源代碼。
build—— 包含 Evil HR Director 應(yīng)用程序和 J2X 項(xiàng)目編譯后的類文件。該文件夾中的 lib 文件夾則包含 HR 應(yīng)用程序和 J2X 項(xiàng)目的 JAR 文件。
lib.zip 文件包含以下文件夾:
lib—— 包含所有的第三方 JAR 文件,運(yùn)行應(yīng)用程序或者任何使用 J2X 項(xiàng)目的項(xiàng)目,需要使用這些文件。在這個(gè)文件夾中,您還會(huì)找到第三方項(xiàng)目的許可。
docs.zip 文件包含下列文件夾:
docs—— 包含 J2X 項(xiàng)目的所有 JavaDoc 信息。
要在應(yīng)用程序中使用 J2X 包,則需要把 CLASSPATH 指向 build/lib 文件夾中的 j2x.jar 以及 lib 文件中包含的所有三個(gè)第三方 JAR 文件。第三方包的許可條款允許您重新發(fā)布本文包含的所有包,但是如果有興趣對(duì)這些包做些修改,請(qǐng)閱讀許可條款。
結(jié)束語
使用 TableModel Free 框架,就不用再編寫傳統(tǒng) TableModel 了。TMF 框架改進(jìn)了 JTable 和 TableModel 模型之間的 MVC 關(guān)系,更清楚地分離了它們。在日后的發(fā)布中,您甚至可以在不修改任何模型代碼的情況下,對(duì)組件進(jìn)行熱交換??蚣苓€允許您在模型發(fā)生變化時(shí),自動(dòng)更新視圖,從而消除傳統(tǒng) TableModel 設(shè)計(jì)中所必需的視圖和模型之間的通信。
TMF 框架還會(huì)極大地減少開發(fā) GUI 所需的時(shí)間,特別是在處理 JTable 時(shí)。幾年以前,我處理的一個(gè)應(yīng)用程序中有 150 多個(gè) JTable,每個(gè)表都來自同一個(gè)原始表模型,該應(yīng)用程序可以作為示例。使用 TMF 框架,我們只用 150 行代碼就能解決問題;但是不幸的是,當(dāng)時(shí)還沒有 TMF,所以我們***編寫了 15,000 行額外的代碼,才生成必需的表模型。這不但增加了開發(fā)時(shí)間,還增加了測(cè)試和調(diào)試的時(shí)間。
與使用傳統(tǒng) TableModel 相比,使用 TMF 框架使您到了一個(gè)更加容易配置所有 JTable 的時(shí)代。請(qǐng)想像這樣一個(gè) POS 應(yīng)用程序:該應(yīng)用程序被銷售給了 5 個(gè)不同的客戶,每個(gè)客戶都有一套特定的信息,所以每個(gè)用戶都想有一組顯示在 GUI 上的特定的列。如果沒有 TMF 框架,您就必須為每個(gè)客戶都生成一組特定的 TableModel —— 由此,也就生成了一組特定的應(yīng)用程序。而使用可配置的 XML 文件,每個(gè)客戶都可以使用相同的應(yīng)用程序,客戶所在地的業(yè)務(wù)分析師可以根據(jù)需要修改 XML 文件。請(qǐng)想像一下,這節(jié)約了多少開發(fā)和支持成本!
TableModel Free 框架解決了 Swing 開發(fā)人員社區(qū)的特定需求:減少了處理 JTable 時(shí)的開發(fā)時(shí)間和維護(hù)開銷,提高了它們對(duì)終端用戶的易用性。Swing 桌面正在回歸,使用像 TMF 框架這樣的工具,開發(fā)人員會(huì)發(fā)現(xiàn)可以更容易地使用 Swing 和開發(fā) GUI 應(yīng)用程序。您要做的***步就是用 TMF 框架的一行代碼代替您所有的 TableModel,把所有 TableModel 都永遠(yuǎn)地拋到虛擬空間的黑洞中去吧。
【編輯推薦】