利用 Rational Application Developer Visual Editor 實(shí)現(xiàn) Swing 可視化組件與數(shù)據(jù)的綁定
引言
Java™可視化編輯器允許用戶以圖形化的方式編輯 Java 用戶界面,
利用Rational Application Developer Visual Editor實(shí)現(xiàn)Sw
。在 IBM Rational Application Developer for WebSphere® Software V6 中,這一功能得到了進(jìn)一步的增強(qiáng)。因?yàn)?V6 支持可視化組件與不 同來(lái)源的數(shù)據(jù)快速綁定,比如,這些數(shù)據(jù)可以來(lái)源于 Web 服務(wù),也可以來(lái)源于 EJB 組件。這篇文章講述了如何利用數(shù)據(jù)綁定的優(yōu)秀特性,用一種快速而強(qiáng)大的 方法,來(lái)定義用戶界面的數(shù)據(jù)讀取和數(shù)據(jù)寫入。Swing 概覽
如同 許多其它部件一樣,AWT(抽象窗口工具)和 Swing 圖形界面組件均被包括在 JAVA 基礎(chǔ)類庫(kù)(JFC)中,它們提供了一個(gè)框架,可以輕松的構(gòu)造圖形用戶界面 (GUI),為 JAVA 應(yīng)用程序添加豐富的圖形化功能性和互操作性。Swing 是一個(gè) 功能豐富的通用工具包,它提供了很多非常實(shí)用的功能。但出于我們的目標(biāo)需要 ,在這里我們只集中描述兩個(gè)重要的功能,因?yàn)檫@兩個(gè)功能對(duì)于理解可視化編輯 器的綁定模型和綁定操作是最為重要的。
使用 Swing 的數(shù)據(jù)模型
大部分的 Swing 組件均有一些模型,利用這些模型,您可以靈活地決定 如何存儲(chǔ)和檢索應(yīng)用程序中的數(shù)據(jù)。其中,在 Rational Application Developer(以下簡(jiǎn)稱為Application Developer)的數(shù)據(jù)綁定工具中就有兩個(gè)這 樣的模型,它們是文檔和表格模型,下面讓我們看看這兩個(gè)模型:
圖 1 :文擋模型
在文檔模型中(如圖 1),使用文本組件從它的數(shù)據(jù)視圖中分離出數(shù) 據(jù)(稱為模型),該模型實(shí)現(xiàn)了 javax.swing.text.Document 接口,并提供以 下的服務(wù):
包含文本。文檔把文本內(nèi)容存儲(chǔ)在 javax.swing.text.Element 對(duì)象中,同時(shí)還可表示任意文本邏輯結(jié)構(gòu),比如段 落、共享樣式文本等等。
通過(guò) remove(String aString) 和 insertString(int position, String aString, AttributeSet anAttributeSet) 來(lái)提供對(duì)文本編輯的支持。
將文本的改動(dòng)通知給文檔 并使編輯 可撤銷改動(dòng)。
管理 Position 對(duì)象。當(dāng)文本內(nèi)容 被更改時(shí),Position 對(duì)象會(huì)跟蹤文本中的特定位置。
使您能夠獲取文本 的相關(guān)信息(例如它的長(zhǎng)度),以及文本片段。
下面是在文本域中設(shè)置 一個(gè)文檔的例子:
Document doc = new MyDocument();
...
textfield = new JTextField();
textfield.setDocument (doc);
圖 2:表格模型
在表格模型中(圖 2),圖形化組件使您可以列出行和列的數(shù)據(jù),同 時(shí)有滾動(dòng)條來(lái)提供分頁(yè)功能。每一個(gè)表格都從實(shí)現(xiàn) javax.swing.table.TableModel 接口的對(duì)象中獲取數(shù)據(jù)。通常,您可以將表格 模型作為 javax.swing.table.AbstractTableModel 類的子類來(lái)實(shí)現(xiàn)。
您的表格模型可以用 array、list、或 hash map 來(lái)存儲(chǔ)數(shù)據(jù),或者可以從外部 數(shù)據(jù)源(比如數(shù)據(jù)庫(kù))獲取內(nèi)容。在某些情況下,模型可以在執(zhí)行期間實(shí)際生成 數(shù)據(jù)。
我們可以用 JTable 顯示任意數(shù)據(jù)模型,并通過(guò)下面的代碼來(lái)實(shí) 現(xiàn) TableModel 接口:
TableModel myData = new MyTableModel ();
JTable table = new JTable();
table.setModel (myData);
使用 Swing 操作
當(dāng)有兩個(gè)或更多執(zhí)行相同功能 的組件時(shí),我們通常使用操作對(duì)象將功能封裝起來(lái),并實(shí)現(xiàn) javax.swing.Action 接口。操作對(duì)象是一種操作 ,它提供操作--事件的 處理。使用 setAction 方法將操作添加到組件中,就會(huì)產(chǎn)生以下效果:
組件的狀態(tài)被更新以匹配操作的狀態(tài)。例如,如果設(shè)置了操作的文本和圖標(biāo)的值 ,組件的文本和圖標(biāo)就會(huì)更新,以反映這種變化。
在組件中,操作對(duì)象 被注冊(cè)為操作
如果操作的狀態(tài)發(fā)生改變,組件的狀態(tài)會(huì)被更新以 匹配該操作。例如,如果您改變了操作的啟用狀態(tài),所有與之關(guān)聯(lián)的組件都會(huì)改 變各自的啟用狀態(tài),以匹配操作的改變。
這里有一個(gè)為按鈕設(shè)置操作的 例子:
Action myAction = new MyAction();
...
button = new JButton();
button.setAction (myAction);
Swing 可視化組件的數(shù)據(jù)綁定
Eclipse 中的 可視化編輯器使用 AWT/Swing 組件來(lái)支持可視化結(jié)構(gòu)。設(shè)計(jì)選項(xiàng)板包含了常用 的組件、容器、菜單及控件,并使用可擴(kuò)展、壓縮和打開(kāi)的 drawer 將它們組織 起來(lái)。
如果在綁定 Swing 可視化組件時(shí)不使用 Application Developer binder, 那么就是一種手動(dòng)操作處理,這就要求我們?cè)谠O(shè)計(jì)代碼編輯器(design source editor)中加入正確的代碼。然而,如果我們使用 binder,就可以使用數(shù)據(jù)源 、數(shù)據(jù)對(duì)象以及 Swing binder 助手類的組合,并利用可視化反饋,從而可以更 加快速、更加簡(jiǎn)便的進(jìn)行可視化組件的數(shù)據(jù)綁定。
Application Developer 中支持的缺省 Swing 可視化組件包括文本域、表格 、按鈕。如果需要,您還可以通過(guò)實(shí)現(xiàn)所提供的接口,為其它組件編寫 binder 。Visual Editor 提供的對(duì)話框可以幫助您創(chuàng)建數(shù)據(jù)對(duì)象和數(shù)據(jù)源,您可以使用 它們來(lái)綁定可視化組件。然而,如果不使用這些對(duì)話框,您還可以通過(guò)選項(xiàng)板添 加基本數(shù)據(jù)對(duì)象、數(shù)據(jù)源數(shù)據(jù)對(duì)象及數(shù)據(jù)源,并使用 Properties 視圖對(duì)它們進(jìn) 行配置?紤]到將來(lái)可能要支持其它選件(widget)庫(kù),數(shù)據(jù)源和數(shù)據(jù)對(duì)象類均 完全獨(dú)立于可視化組件。
當(dāng)您將可視化組件綁定到數(shù)據(jù)源和數(shù)據(jù)對(duì)象時(shí),binder 代碼會(huì)根據(jù)需要被生 成到您的項(xiàng)目源文件目錄中。在缺省情況下,所生成的類會(huì)被添加到項(xiàng)目的 jve.generated 包中。然后,您可以自由地?cái)U(kuò)展、替換、或重寫數(shù)據(jù)綁定邏輯。 倘若您更改了 jve.generated 類并添加一些自定義的業(yè)務(wù)邏輯,它們將不會(huì)被 Visual Editor 改寫。
Swing binder
Binder 將可視化組件連接到數(shù)據(jù)對(duì)象?梢暬M件和它的 binder 之間是一 對(duì)一的關(guān)系。但數(shù)據(jù)對(duì)象和同它發(fā)生交互的 binder 之間則是一對(duì)多關(guān)系。換句 話說(shuō),就是可以將多個(gè)可視化組件綁定到一個(gè)給定的數(shù)據(jù)對(duì)象,但每個(gè)可視化組 件都需要它自己的 binder。
數(shù)據(jù)源
數(shù)據(jù)源如同數(shù)據(jù)工廠,它的目的是為數(shù)據(jù)對(duì)象提供數(shù)據(jù),以及獲取原始數(shù)據(jù) 。Application Developer 的可視化編輯器支持的數(shù)據(jù)源包括 J2EE 會(huì)話 bean 、Web 服務(wù)以及JavaBean。數(shù)據(jù)源可以看作是虛包(facade)工廠,它提供了各 種配置屬性,從而可以實(shí)現(xiàn)數(shù)據(jù)源虛包的實(shí)例化和初始化。虛包是包含一套方法 的類,利用它,你可以從后臺(tái)創(chuàng)建數(shù)據(jù)對(duì)象,或提供一些其它的業(yè)務(wù)功能。當(dāng)然 ,這需要數(shù)據(jù)源實(shí)現(xiàn)者正確地實(shí)例化虛包。
數(shù)據(jù)對(duì)象
數(shù)據(jù)對(duì)象代表本地可用數(shù)據(jù)的對(duì)象。利用它,客戶端組件可以進(jìn)行交互;它 也是對(duì)象的封裝器,可以管理該對(duì)象的屬性變更事件。
圖 3 顯示的是 Application Developer 中的設(shè)計(jì)選項(xiàng)板,包括可視化組件 的 drawer,以及數(shù)據(jù) binder。
圖 3:Rational Application Developer 設(shè)計(jì)選項(xiàng)板
MyBooks 應(yīng)用程序范例
這里,我們對(duì) MyBooks 程序做了一些改動(dòng),以便我們能更好地關(guān)注 Application Developer visual editor for data binding 所支持的三個(gè) Swing 可視化組件:JTextField、JTable 和 JButton。圖 4 顯示了 MyBooks 應(yīng)用程序的一個(gè)屏幕截圖,該程序?qū)?XML 數(shù)據(jù)顯示在 JTable 中,XML 文件名 顯示在 JTextField 里,同時(shí)還有一個(gè)名為 SAVE 的 JButton。
圖 4 MyBooks 應(yīng)用程序表格模型
MyBooks 采用了一個(gè)參數(shù):XML 文件的名稱,它包含了所有在表格中顯示的 書籍清單。當(dāng)我們按下了 SAVE 按鈕后,表格中的內(nèi)容將被保存在文本域中指定 的 XML 文件里。
為了創(chuàng)建 MyBooks 應(yīng)用程序,我們?cè)?A 部分中設(shè)計(jì)好基本 GUI,然后在 B 部分中使用 Application Developer 可視化地將 GUI 與數(shù)據(jù)綁定起來(lái)。
A 部分:構(gòu)建用戶界面和 JAVA 數(shù)據(jù)工廠
為了構(gòu)建 MyBooks 的用戶界面,我們將使用可視化編輯器:
創(chuàng)建一個(gè) JAVA 項(xiàng)目
在 Application Developer 中,選擇 File => New => Project。
選擇 Java Project 并按下 Next 按鈕。
為項(xiàng)目輸入名稱 MyBooks ,然后按下 Next 按鈕。
從 Application Developer 安裝程序中將 xsdbeans.jar 添加到 Java 構(gòu)建 路徑中,這個(gè) JVR 文件位于:
按下 Finish 按鈕。
創(chuàng)建包 ve.eclipse 和 ve.rad。
添加主要的可視類
在 Package Explorer 中,右鍵單擊項(xiàng)目并選擇 New => Other。
選擇 Visual Class 然后按下 Next 按鈕。
指定壓縮包的名稱為 ve。
指定類的名稱為 MyBooksApp。
確保超類 Superclass 是 javax.swing.JFrame,并且 public static void Main(String[] args) 被選中。
按下 Finish 按鈕。
定制 JFrame
將私有變量 filename 添加到該類中,數(shù)據(jù)類型為 String。
修改構(gòu)造函數(shù) MyBooksApp() 的結(jié)構(gòu),使其如下所示:
public MyBooksApp(String f) {
super();
filename = f;
initialize();
}
修改 main(),使其如下所示: public static void main(String[] args) {
MyBooksApp app = new MyBooksApp(args[0]);
app.show();
}
在可視化編輯器窗口中選擇文本 JFrame,并在彈出的可編輯文本框中,輸入 MyBooks。
在可視化編輯器窗口中選擇 JFrame. 組件,并確保當(dāng)前處于 Properties 視 圖。
從 Properties 視圖中,將屬性 defaultCloseOperation 設(shè)置為 EXIT,然 后按下 Enter 按鈕。
從 Properties 視圖中,將屬性 size 設(shè)置為 400,200,然后按下 Enter 按 鈕。
添加一個(gè)文本域
功能:這一可視化組件將顯示 XML 文件名。
在選項(xiàng)板的 Swing Containers 部分中選擇 JPanel。 然后把它拖放到可視 化編輯器中 JFrame. 組件之外的位置。
在選項(xiàng)板的 Swing Containers 部分中選擇 JLabel,然后把它拖放到 JPanel 中。
從 Properties 視圖中,將 JLabel 的 text 屬性設(shè)為 XML filename:,然 后按下 Enter。
在選項(xiàng)板的 Swing Containers 部分中選擇 JTextField,然后把它拖放到 JPanel 中。
將 JPanel 放置在 JFrame. 的 North 部分。
添加一個(gè)按鈕
功能:這個(gè)可視化組件可以將表格中的數(shù)據(jù)保存到指定的 XML 文件中。
在選項(xiàng)板的 Swing Components 部分中選擇 JButton,并將它放置在 JFrame. 的 South 部分。
從 Properties 視圖中,將 JButton 的 text 屬性設(shè)為 SAVE,然后按 Enter。
添加一個(gè)表格
功能:該可視化組件將顯示 XML 文件的內(nèi)容
在選項(xiàng)板的 Swing Containers 部分中,選擇 JScrollPane 上的 JTable, 并把它放置到 JFrame. 的 Center 部分。
按下 CTRL-S 以保存可視類,然后關(guān)閉編輯器。
將類復(fù)制到 ve.eclipse 和 ve.rad 中。
這個(gè)練習(xí)的用戶界面部分現(xiàn)在已經(jīng)完成:我們創(chuàng)建了一個(gè) JAVA 項(xiàng)目以存儲(chǔ) 可視類 JFrame, 可視類由三個(gè)關(guān)鍵的 Swing 組件構(gòu)成,即 JTextField、 JButton 和 JTable.
不過(guò),我們只是完成了第一部分工作的一半,下一步就要編寫業(yè)務(wù)邏輯。利 用這些業(yè)務(wù)邏輯,我們可以在可視類和數(shù)據(jù)源之間進(jìn)行數(shù)據(jù)的讀取或?qū)懭搿T谶@ 個(gè)案例中,我們的數(shù)據(jù)源就是 XML 文本。此時(shí),可視化編輯器中的 GUI 如圖 5 所示。
圖 5:MyBooks GUI
Java 數(shù)據(jù)工廠的主要功能在于讀取 XML 文件的內(nèi)容。不過(guò),在我們創(chuàng)建 Java 數(shù)據(jù)工廠以前,我們得先創(chuàng)建 XML 文件和兩個(gè)數(shù)據(jù)類型:
創(chuàng)建 XML 文件
在 MyBooks 項(xiàng)目中新建一個(gè)文件,命名為 books.xml ,然后把下面的這些 內(nèi)容復(fù)制到所生成的文件中:
Parkin, Burrus, Pullin
Sibley
創(chuàng)建 book 數(shù)據(jù)類型
XML 文件的每個(gè)條目都會(huì)存儲(chǔ)在 book 對(duì)象中。新建一個(gè) JAVA 類,并把它 命名為ve.book,然后把下面的代碼粘貼到文件內(nèi)容中: =package ve;
import com.ibm.etools.xmlschema.beans.*;
public class book extends ComplexType {
public book() {
}
public void setTitle(String title) {
setElementValue("title", title);
}
public String getTitle() {
return getElementValue("title");
}
public boolean removeTitle() {
return removeElement("title");
}
public void setAuthor(String author) {
setElementValue("author", author);
}
public String getAuthor() {
return getElementValue("author");
}
public boolean removeAuthor() {
return removeElement("author");
}
public void setCopyrightDate(String copyrightDate) {
setElementValue("copyrightDate", copyrightDate);
}
public String getCopyrightDate() {
return getElementValue ("copyrightDate");
}
public boolean removeCopyrightDate () {
return removeElement("copyrightDate");
}
}
創(chuàng)建 books 的數(shù)據(jù)類型
books 對(duì)象存儲(chǔ) book 的條目清單,
電腦資料
《利用Rational Application Developer Visual Editor實(shí)現(xiàn)Sw》(http://m.clearvueentertainment.com)。新建一個(gè) JAVA 類,并把它命名為 ve.books ,將內(nèi)容設(shè)置為:package ve;
import com.ibm.etools.xmlschema.beans.*;
public class books extends ComplexType {
public books() {
}
public void setBook(int index, book book) {
setElementValue(index, "book", book);
}
public book getBook(int index) {
return (book) getElementValue("book", "book", index);
}
public int getbookCount() {
return sizeOfElement ("book");
}
public boolean removeBook(int index) {
return removeElement(index, "book");
}
}
創(chuàng)建 Java 數(shù)據(jù)工廠
新建一個(gè) Java 類,并把它命名為 ve.MyBooksDataSource,其內(nèi)容如下: package ve;
import com.ibm.etools.xmlschema.beans.*;
public class MyBooksDataSource extends Factory {
public MyBooksDataSource() {
super();
}
public book[] getBooks() {
books iBooks = (books) loadDocument("books", getXMLFilename());
book[] result = new book[iBooks.getbookCount()];
for (int i = 0; i < iBooks.getbookCount(); i++) {
result[i] = iBooks.getBook(i);
}
return result;
}
public BaseType loadDocument(String className, String filename) {
return super.loadDocument(className, filename);
}
}
如果我們現(xiàn)在運(yùn)行 MyBooks 應(yīng)用程序,會(huì)發(fā)現(xiàn)應(yīng)用程序還沒(méi)有數(shù)據(jù)內(nèi)容,因 為所有的 Swing 組件都尚未和數(shù)據(jù)綁定。在接下來(lái)的這一部分,我們將把數(shù)據(jù) 綁定到可視化組件。
B 部分:使用可視化編輯器綁定 MyBooks 用戶界面
我們繼續(xù)以自頂向下的方式來(lái)構(gòu)建 GUI,各個(gè)組件已經(jīng)被放置好。一旦看上 去沒(méi)什么缺陷,我們現(xiàn)在可以提供邏輯,使組件可以訪問(wèn)并更新數(shù)據(jù)。現(xiàn)在,我 們將可視化組件與對(duì)應(yīng)的數(shù)據(jù)綁定起來(lái)。
打開(kāi) JFrame
在 Application Developer 中,選擇 File => Import。
選擇 Existing Project into Workspace,然后按下 Next 按鈕。
選擇之前已創(chuàng)建的 MyBooks 項(xiàng)目,然后按下 Finish 按鈕。
在可視化編輯器中打開(kāi) ve.rad.MyBooksApp。
綁定文本域
選擇 textfield,這時(shí),在 textfield 的左上方會(huì)出現(xiàn)一個(gè) Bind... 選項(xiàng) 。
選擇 Bind...,會(huì)打開(kāi)一個(gè)對(duì)話框,該對(duì)話框可以讓您指定如何綁定到數(shù)據(jù) 的細(xì)節(jié)。
在 Field Data Bindings 窗口中,選擇 New Data Source Data Object... 。
在 New Data Source Data Object 窗口中,選擇 Java Bean Factory 作為 source type。
選擇 Data source 下拉框后面的 New...。
在 Choose a Bean 窗口中,搜索并選擇 ve.MyBooksDataSource。然后按下 OK 按鈕以添加該數(shù)據(jù)源。
在 Source service 文本框中,選擇 getXMLFilename() ,這是數(shù)據(jù)源虛包 MyBooksDataSource.java 中一個(gè)方法的名稱。
在 Name 文本域中,將 stringObject 改為 xmlFilename,然后按下 OK 按 鈕。
再次按下 OK 按鈕。
綁定表格
選擇表格,在表格的左上方會(huì)出現(xiàn)一個(gè) Bind... 選項(xiàng)
選擇 Bind...。
在 Table Data Bindings 窗口中,選擇 New Data Source Data Object... 。
在 New Data Source Data Object 窗口中,只出現(xiàn)一個(gè) source service 方 法 getBooks(),這是返回?cái)?shù)組數(shù)據(jù)的唯一方法,這些數(shù)據(jù)可以在表格中使用。 按下 OK 按鈕,這時(shí)我們就選用了 getBooks() 方法。
將數(shù)據(jù)對(duì)象屬性 author、copyrightDate及 title 添加到表格的列清單中。
按下 OK 按鈕。
在可視化編輯器中,選擇非可視 bean MyBooksDataSource,打開(kāi)或激活 Properties 視圖。
展開(kāi)屬性 dataSource。
將屬性 encoding 設(shè)為 UTF-8 ,然后按下 Enter 按鈕。
將屬性 encodingTab 設(shè)為 UTF-8 ,然后按下 Enter按鈕。
將屬性 packageName 設(shè)為 ve,然后按下 Enter 按鈕。
將屬性 xmlFilename 設(shè)為 filename ,并按下 Enter. 按鈕,然后在代碼編 輯器中修改生成的代碼, 將
myBooksDataSource1.setXMLFilename("filename");
改為:
myBooksDataSource3.setXMLFilename(filename);.
綁定按鈕
選擇按鈕,在按鈕的左上方會(huì)出現(xiàn)一個(gè)Bind...選項(xiàng)
選擇 Bind... .
在 Component Action Bindings 窗口中,選擇 source service 文本框里的 save(java.lang.String)。
在 Argument 下拉列表框中,選擇 xmlFilename
按下 OK 按鈕。
保存文件。
現(xiàn)在,MyBooks 應(yīng)用程序已完成,圖 6 顯示的是該程序的屏幕截圖。
圖 6:已完成的 MyBooks 應(yīng)用程序
測(cè)試應(yīng)用程序
為了測(cè)試您的應(yīng)用程序,您需要在運(yùn)行配置中提供 XML 文件名作為參數(shù):
在工具條上,選擇 Run 圖標(biāo)旁的箭頭,并選擇 Run...
在 Run 窗口中,選擇 Java Application 作 為啟動(dòng)程序。
按下 New,在窗口中會(huì)彈出一個(gè)新的運(yùn)行配置框,Main 選項(xiàng)卡中,填入您的項(xiàng)目名 MyBooks 和應(yīng)用程序名 ve.rad.MyBooksApp。
選擇 Arguments 選項(xiàng)卡,輸入 XML 文件名的全路徑,當(dāng)應(yīng)用程序啟動(dòng)時(shí),在 Arguments 選項(xiàng)卡中填寫的程序參數(shù)將被傳遞給 main(String[] args) 方法,這就是該應(yīng)用程序獲得參數(shù)值的方法。
選擇 Run。
更改 XML 文件名。
按下 Save 按鈕。檢查表格的內(nèi)容是否被保存到指定的文件和位置。
關(guān)閉 MyBooksApp。
C 部分: 使用 Eclipse 可視化編輯器綁定 MyBooks 用戶界面(可選)
本部分是可選擇,因?yàn)樗枋龅氖鞘褂?Eclipse 可視化編輯器(它沒(méi)有數(shù)據(jù)綁定工具)來(lái)綁定第一部分中創(chuàng)建的用戶界面,本部分的目的是與 Application Developer 提供的綁定工具進(jìn) 行對(duì)比,從而凸顯使用數(shù)據(jù)綁定工具的優(yōu)勢(shì)。
為了使用 Eclipse 可視化編輯器,我們需要以下組件(這些組件可以從 Eclipse 可視化編輯器項(xiàng)目中下載):
Eclipse build eclipse-SDK 3.0.1
Visual Editor 1.0.2
EMF build 2.0.1
GEF build 3.0.1
創(chuàng)建表格模型
為了在運(yùn)行時(shí)顯示表格,你必須為表格模型提供實(shí)際數(shù)據(jù),然后將表格模型和 JTable bean 相關(guān)聯(lián)。表格模 型提供了多種可以被 JTable bean 調(diào)用的方法,利用這些方法,JTable bean 就能獲取一些信息,如表格的行數(shù)和列數(shù),或者是用在特定表格單元的數(shù)據(jù)。您需要在表格模型類中實(shí)現(xiàn)這些方 法,這樣,JTable bean 就可以訪問(wèn)模型中的數(shù)據(jù),并在表格視圖中顯示出來(lái)。
下面,我們新建一個(gè) JAVA 類,并命名為 ve.eclipse.MyBooksTableModel。用下面的代碼代替所生成的文件的內(nèi)容:
package ve.eclipse;
import javax.swing.table.AbstractTableModel;
import ve.*;
public class MyBooksTableModel extends AbstractTableModel {
private MyBooksDataSource iBooksFactory;
private books iBooks;
public MyBooksTableModel() {
super();
}
public MyBooksTableModel(String xmlFile) {
super();
iBooksFactory = new MyBooksDataSource();
iBooksFactory.setPackageName("ve");
iBooksFactory.setEncoding("UTF8");
iBooksFactory.setEncodingTag("UTF-8");
iBooks = (books) iBooksFactory.loadDocument("books", xmlFile);
}
public String getXMLFile() {
return iBooksFactory.getXMLFilename();
}
public void setXMLFile(String filename) {
iBooksFactory.setXMLFilename(filename);
}
public void save(String fname) {
iBooksFactory.save(fname);
}
public int getColumnCount() {
return 3;
}
public int getRowCount() {
return iBooks.getbookCount();
}
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0: return iBooks.getBook(rowIndex).getTitle();
case 1: return iBooks.getBook(rowIndex).getAuthor();
case 2: return iBooks.getBook(rowIndex).getCopyrightDate();
}
return null;
}
public String getColumnName(int arg0) {
switch (arg0) {
case 0: return "Title";
case 1: return "Author";
case 2: return "Copyright Date";
}
return "";
}
}
綁定表格 table
a.在可視化編輯器中打開(kāi) ve.eclipse.MyBooksApp.java。
b.從選項(xiàng)板中選擇 Choose Bean ,會(huì)彈出 Choose a Bean 對(duì)話框。
c.找到 ve.eclipse.MyBooksTableModel,并按下 OK 按鈕。
d.把非可視 bean 放到可視化編輯器中,注意不要和 JFrame. 重疊,這一操作將生成 getMyBooksTableModel()。
e.修改 getMyBooksTableModel(),使其如下所示:
private MyBooksTableModel getMyBooksTableModel() {
if (myBooksTableModel == null) {
myBooksTableModel = new MyBooksTableModel(filename);
}
return myBooksTableModel;
}
f.在 Java Beans 視圖中,選擇 table。
g.修改 getJTable(),使其如下所示:
private JTable getJTable() {
if (jTable == null) {
jTable = new JTable();
jTable.setModel(getMyBooksTableModel());
}
return jTable;
}
綁定文本域
a.在 Java Beans 視圖中選擇 text field。
b.修改 getJTextField(),使其如下所示:
private JTextField getJTextField() {
if (jTextField == null) {
jTextField = new JTextField();
jTextField.setText(filename);
}
return jTextField;
}
綁定按鈕 button
a.右鍵單擊 SAVE 按鈕,并選擇 Events => actionPerformed.
b.修改 getJButton(),如下所示:
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setText("SAVE");
jButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
getMyBooksTableModel().save(getJTextField().getText());
}
});
}
return jButton;
}
c.保存文件。
5.測(cè)試應(yīng)用程序
為了測(cè)試您的應(yīng)用程序,您需要在運(yùn)行配置中提供 XML 文件名作為參數(shù):
a.在工具條上,選擇 Run 圖標(biāo)旁的箭頭,然后選擇 Run...
b.在 Run 窗口中,選擇 Java Application 作為啟動(dòng)程序。
c.按下 New 按鈕,在窗口中會(huì)彈出一個(gè)運(yùn)行配置框,然后在 Main 選項(xiàng)卡中,填寫項(xiàng)目名 MyBooks,及應(yīng)用程序名 ve.eclipse.MyBooksApp。
d.選擇 Arguments 選項(xiàng)卡,輸入 XML 文件名的全路徑,當(dāng)應(yīng)用程序啟動(dòng)時(shí),在 Arguments 選項(xiàng)卡中輸入的程序參數(shù)將被傳遞給 main(String[] args) 方法, 這就是該應(yīng)用程序獲得參數(shù)值的方法。
e.選擇 Run。
f.更改 XML 文件名。
g.按下 Save 按鈕。檢查表格內(nèi)容是否被保存到指定的文件和位置。
h.關(guān)閉 MyBooksApp。
這個(gè)練習(xí) 的可選部分也完成了。你會(huì)注意到,許多步驟都需要手工編寫代碼將數(shù)據(jù)綁定到用戶界面,尤其是表格模型。相比之下,Application Developer 的可視化編輯器提供了非常簡(jiǎn)便的用戶界面 ,利用它,絕大部分代碼都可以自動(dòng)生成。
結(jié)束語(yǔ)
Application Developer Visual Editor 為我們提供了很多易于使用的工具。利用它,只需對(duì)生成的代碼作小小的改動(dòng),即可綁定 Swing 可視化組件,如文本域、表格、按鈕。使用文檔模型可以自動(dòng)設(shè)置文本域中的文本;且表格模型也是自動(dòng)生成并被添加到表格組件中;操作被自動(dòng)設(shè)置到按鈕中。相比之下,用 Eclipse 完成同樣的任務(wù),則需要更多的手工處理。您必須創(chuàng)建自己的表格模型,并編寫相關(guān)原代碼,設(shè)置文本域中的文本,為按鈕添加操作 ,并在表格上設(shè)置表格模型,F(xiàn)在, Application Developer 的價(jià)值已經(jīng)很清晰了;您可以馬上用它來(lái)簡(jiǎn)化 J2EE 應(yīng)用程序的開(kāi)發(fā)。