




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、開始使用 Jigloo:Eclipse 的 GUI 構造器開始之前本教程適用于想要構建桌面應用程序并使用名為 Jigloo 的 Eclipse 插件來為其應用程序創建 UI 的 Java 開發人員。樣例應用程序將使用 XML、XML Schema 和 JAXB 以及一些 Java 5 功能,例如 Annotation 和 Generic。關于本教程Java 是構建富桌面應用程序的優秀平臺。當 Java 于 1995 年出現時,它附帶了 Abstract Window Toolkit (AWT)。這曾是 Java 的第一個用于構建桌面應用程序的 UI 庫。1998 年發行的 JDK 1.2 包括
2、 Swing,一個有很大改進的工具包。在那之后,還對 Swing 進行了多次改進。它現在是一個功能強大的 UI 庫,可在多種不同的平臺上良好運行。SWT 是一個適用于 Java 的非常有競爭力的 UI 工具包,它可提供很多優點。現在使用 Jigloo,您可以快速構建以 Swing 或 SWT 為目標的 UI。您甚至可以構建包括 Swing 組件的 SWT 應用程序,但是那超出了本教程的討論范圍。在本教程中,您將通過構建簡單的工作流應用程序來了解 Jigloo。您將使用 Eclipse 插件 Jigloo 來為應用程序創建 UI。然后將構建和測試應用程序,并將其打包以供其他人使用。 HYPERL
3、INK /developerworks/cn/education/opensource/os-eclipse-jigloo/index.html l ibm-pcon 回頁首先決條件熟悉事件處理程序和數據綁定的 UI 編程概念將非常有用,但不是絕對必要的。了解 AWT/Swing 或 SWT 也會十分有用,但不作要求。系統需求 HYPERLINK /downloads/ Eclipse V3.2 由于 Jigloo 是 Eclipse 的插件,因此您當然需要 Eclipse。應用程序將使用 SWT,并且 Eclipse 還包括所需的 SWT 庫。 HYPERLINK /jigloo/dnld_
4、redirect.html Jigloo Jigloo 是 Eclipse 的插件。在教程中,您將看到如何使用 Eclipse 強大的更新管理器從 Eclipse 直接安裝 Jigloo。 Java 5+ 本教程中的應用程序將使用一些 Java 5 功能,例如 Annotation 和 Generic。下載 HYPERLINK /javase/downloads/index_jdk5.jsp Java 5 或 HYPERLINK /javase/downloads/index.jsp Java 6。 JAXB V2.0 本教程中的應用程序將使用 XML 作為數據存儲,并將使用 JAXB 解析和
5、序列化 XML。如果使用的是 Java 6,則已經包括了 JAXB 并且不需要做其他操作。如果使用的是 Java 5,您將需要使用 Sun 的 HYPERLINK /2.1.2/ JAXB 2.0 Reference Implementation (RI)。 使用 SWT GUI 創建工作流應用程序 HYPERLINK /developerworks/cn/education/opensource/os-eclipse-jigloo/authors.html l author1 o Michael Galpin, 開發人員, MichaelDKMichael Galpin 從 1998 年開始
6、就開始專職開發 Java 軟件。他目前在位于加利福尼亞州 Mountain View 的 Ludi Labs 工作。他擁有加州理工學院的數學學位。簡介: Jigloo 是一個 Eclipse 插件,使您可以快速構建在 Java 平臺上運行的復雜圖形用戶界面 (GUI)。它可用于構建基于 Swing 的應用程序和基于 Standard Widget Toolkit (SWT) 的應用程序。它是一個易于使用的可視化編輯器,因此您可以為桌面應用程序快速創建 UI。在本教程中,將構建一個簡單的工作流應用程序并將使用 Jigloo 創建它的 UI。了解開始使用 Jigloo 并進而使用其高級功能(例如可
7、視化繼承)是多么輕松。最后,我們將測試應用程序并將其打包以供其他人使用。 HYPERLINK /developerworks/cn/education/opensource/os-eclipse-jigloo/section2.html 標記本文!發布日期: 2007 年 4 月 17 日 級別: 中級 訪問情況 4447 次瀏覽 建議: 0 ( HYPERLINK /developerworks/cn/education/opensource/os-eclipse-jigloo/section2.html l icomments 添加評論) 平均分 (共 3 個評分 )概述在這一節中,先查看
8、 Jigloo 插件以及您可以使用它完成哪些任務,然后再執行它的安裝和設置步驟。什么是 Jigloo?Jigloo 是一個可視化 Java GUI 生成器。它是 CloudGarden 開發的 Eclipse(和 WebSphere Studio)插件。它可以免費用于非商業應用。要將 Jigloo 用于商業應用,您需要從 CloudGarden 獲得專業許可證。使用 Jigloo 可以完成哪些任務?Jigloo 是一個典型的 WYSIWYG 編輯器,用于構建 Swing 和 SWT GUI。如果需要用 Java 開發圖形桌面應用程序,則 Jigloo 是一個非常不錯的選擇。不過,那只是開始。J
9、igloo 支持雙向傳遞。那意味著您不但可以做出導致底層代碼變化的可視化更改,而且還可以直接編輯代碼并查看在 GUI 中引起的更改。如果配有現有的傳統 GUI,這使 Jigloo 成為非常優秀的選擇。它可以解釋現有的應用程序并允許您進行可視化編輯。它還意味著您可以把 Jigloo 與其他 IDE(如 NetBeans 或 JBuilder)結合使用。Jigloo 是與 Swing/SWT 兼容的。它支持任意一項技術所支持的許多布局選項。您不但可以使用任意一項技術構建新的 GUI,而且甚至可以使用 Jigloo 在 Swing 與 SWT 之間進行轉換。Jigloo 也可以讓您使用 SWT_AW
10、T 橋在 SWT 應用程序內混用 Swing 組件。但是,在本教程中,我們將使用 SWT GUI 構建工作流應用程序。安裝 JiglooJigloo 是一個 Eclipse 插件,因此它非常易于安裝。如果您已經使用了 Eclipse 很多年,那么有可能已經通過將其簡單地解壓縮到 Eclipse 安裝目錄中下載并安裝了插件。最新版本的 Eclipse 甚至使此過程變得更加簡單。您需要做的全部操作就是使用 Eclipse 的 Update Manager 功能。要訪問此功能,請選擇 Help Software Updates Find and Install。此操作將打開 Install/Upda
11、te 對話框。您將需要選擇 “Search for new features to install” 選項。然后只需單擊 Next,您將轉到 Update Site 對話框。如果已經安裝了 Eclipse 插件,“Sites to include in search” 中可能已經列出了其他的站點。如果是這種情況,您需要確保已經取消選中此列表中的任何其他站點。單擊 New Remote Site,將打開 New Update Site 對話框,如下所示。圖 1. New Update Site在這里,重要的是在 URL 字段中輸入 /update-site。您可以在 Name 字段中實際使用任何
12、所需內容,但是您可能將需要使用諸如 Jigloo Update Site 之類的描述性內容。單擊 OK,此操作將把您帶回到 Update Site 對話框,但是現在您剛輸入的更新站點應當會顯示在要包括的站點列表中。單擊 Finish。此操作將打開 Search Results 對話框。在 Search Results 對話框中,選擇 Jigloo 并單擊 Next。此操作將打開 Feature License。如前所述,Jigloo 可以免費使用,但僅限于非商業使用。否則,您必須從 CloudGarden 獲得一個專業許可證。當您閱讀完許可證后,選擇 “I accept the terms i
13、n the license agreement” 接受許可證。然后只需單擊 Next。此操作將為您打開 Installation details 對話框。單擊 Finish。此操作將打開 Feature Verification 對話框。您只需單擊 Install 或 Install All。此操作將啟動安裝。Eclipse 將從 CloudGarden 下載并安裝插件。完成后,您可能需要重新啟動 Eclipse 才能完成安裝過程。祝賀您!您已經安裝了 Jigloo。像大多數 Eclipse 插件一樣,這是一次很輕松的體驗。您現在已經準備好開始使用 Jigloo。首先需要進行一些配置。 HYP
14、ERLINK /developerworks/cn/education/opensource/os-eclipse-jigloo/section2.html l ibm-pcon 回頁首設置 Jigloo使用 Eclipse 創建一個新 Java 項目。選擇 File New Project,然后選擇 Java Project。單擊 Next 將為您打開 New Project 對話框。在本教程中,項目被稱為 “工作流”。您可以根據需要使用任意名稱。在您為其命名后,請單擊 Finish。如前所述,您可以使用 Jigloo 構建 Swing 或 SWT GUI。在本教程中,我們將構建一個 SWT
15、 GUI。這將要求進行一些額外配置。您需要把 SWT JAR 添加到項目的類路徑中。為此,請選擇項目,然后從主菜單中選擇 File Properties。這將打開 Project Properties 屏幕。在左側導航區中選擇 Java Build Path,此操作將打開 Java Build Path 對話框。單擊 Libraries 選項卡,然后單擊 Add External JARs 按鈕。此操作將打開一個文件資源管理器對話框。您需要導航到 $ECLIPSE_HOME/plug-ins,其中 $ECLIPSE_HOME 是 Eclipse 的安裝位置,如下所示:圖 2. Eclipse
16、插件目錄您需要查找 org.eclipse.swt.X.X.X.jar。X.X.X. 會因所使用的平臺及實際的 Eclipse 版本而有所不同。單擊 Open,然后單擊 OK 返回到 Java Build Path 屏幕。您已經創建了一個基本的 Java 項目,并已經把 SWT 庫添加到其類路徑中。現在,您已經準備好開始使用 Jigloo 來設計和開發工作流應用程序。工作流應用程序我們的示例是一個非常簡單的工作流應用程序。我們的應用程序中將有兩類用戶:工人和經理。工人將使用該應用程序輸入購買請求。他們將能夠輸入購買訂單的相關信息。他們還將能夠查看輸入的所有訂單的狀態。每個購買訂單可以有三種可能
17、狀態中的一種:待審批、批準、拒絕。經理們使用的應用程序略有不同。經理將能夠看到狀態為待審批的所有購買訂單。然后經理可以批準或拒絕購買訂單。這將是一個簡單的應用程序,因此我們不必擔心用戶登錄和登出。相反,我們將簡單表示系統中的用戶列表;應用程序用戶可以簡單地選擇希望使用的用戶登錄身份。在實際的工作流系統中,并發是個大問題。我們無需擔心我們的應用程序會遇到這個問題,因為它將不會在多個系統上運行。實際的工作流系統還需要在共享存儲庫(通常為關系數據庫)中保留工作流數據。我們將通過把數據簡單保存在 XML 文件中使應用程序更簡單。我們將使用 JAXB 打包和解包 XML 數據。接下來,我們將開始為 GU
18、I 編寫實際的代碼。設置 GUI既然我們有了系統的基本設計,是時候開始編寫一些代碼了。我們將把注意力集中在 GUI 上并使用 Jigloo。設計工作流應用程序的 GUI讓我們開始設計工作流應用程序的 GUI。首先,讓我們為工作流應用程序創建一個軟件包。在 Package Explorer 窗格中右鍵單擊項目并選擇 New Package。讓我們把基本軟件包稱為 org.developerworks.workflow。單擊 Finish。現在,讓我們在此軟件包中創建應用程序。右鍵單擊軟件包并選擇 New Other。這將打開 “Select a wizard” 屏幕。可以在此屏幕的 GUI Fo
19、rms 文件夾中找到所有 Jigloo 向導。打開該文件夾,然后打開 SWT 文件夾并選擇 SWT Main Application 選項,如圖 3 所示。圖 3. Select a wizard單擊 Next 打開 New SWTApp 向導。將主類命名為 WorkflowMain,如圖 4 所示:圖 4. New SWTApp 向導您可以將其他內容保留原樣并單擊 Finish。Jigloo 可視化設計器視圖現在 Eclipse 工作區應當類似圖 5。圖 5. 顯示 WorkflowMain 的 Eclipse這里有很多有趣的內容需要注意。首先,我們的主窗口將顯示 Jigloo 所使用的自定
20、義視圖。此視圖是一個分塊顯示的屏幕。頂部是 Jigloo 可視化設計器。我們將在此對話框中完成很多工作,因為它允許我們通過使用拖放操作來設計 GUI。我們將更詳細地介紹此視圖。位于屏幕底部的是應用程序的 Java 代碼,我們稍后將介紹。注意 Jigloo 是怎樣已經為我們生成了大量代碼。在主窗口下,我們可以看到 GUI Properties 窗口。此視圖將向我們顯示在可視化設計器窗口中選定的任何可視化組件的詳細屬性。我們也將大量使用此視圖。最后,請注意在 Package Explorer 視圖中存在另一個軟件包:com.cloudscape.resource。此軟件包包含生成的類 SWTRes
21、ourceManager。正如它的名稱暗示的那樣,此類將管理 SWT 資源,例如字體、顏色和圖像。如果您曾使用過可視化設計工具(如 Jigloo),則可能已經看到過類似于這樣的類。通常這些類包括關于不要修改類中任何內容的嚴厲警告,因為它們非常脆弱并且修改可能會造成異常,或者您所做的更改可能會被覆蓋。那種情況不會出現在 SWTResourceManager 上。您可以修改它來更改它所管理的資源,如應用程序的默認字體,并且 Jigloo 將不會覆蓋更改,它也不會導致任何中斷。讓我們開始使用可視化設計器。如果您曾經使用過 Eclipse,則可能知道您可以通過簡單地雙擊窗口的名稱將任何窗口最大化。讓我
22、們雙擊窗口的名稱把 WorkflowMain 窗口最大化,如圖 6 所示。圖 6. 最大化的 WorkflowMain這樣做不但可以為可視化設計器提供更多真實的狀態以供使用,而且使您可以更輕松地訪問 GUI 屬性(右下角)。它還在右上角顯示 GUI 的層次結構表示。現在它還十分簡單,但是隨著我們向 GUI 中添加更多組件,我們將會看到這些組件添加到了層次結構中。它還為我們提供了預覽或運行應用程序進行測試的有用控件。既然我們已經更加熟悉可視化設計器,那么讓我們開始使用它來配置應用程序。 HYPERLINK /developerworks/cn/education/opensource/os-ec
23、lipse-jigloo/section3.html l ibm-pcon 回頁首使用可視化設計器進行開發如果您以前開發過 Swing 或 SWT 應用程序,則可能熟悉多種可用的布局管理器。布局管理器一直都是 Java GUI 應用程序的強大功能。對 GUI 布局時,布局管理器將允許應用各種算法。Java 的座右銘一直都是 “編寫一次,可在任何位置運行”,并且這些布局算法都是與這個座右銘一致的。不管顯示 GUI 的屏幕或窗口的幾何尺寸如何,這些布局算法都允許 GUI 應用程序的布局正常運行。這些布局算法惟一的弊端是它們向開發人員呈現一種學習曲線,尤其是那些曾經使用絕對定位元素的其他平臺的開發人
24、員。使用絕對定位,您只需將組件放置在屏幕上的所需位置,并且那就是它將在的位置。此類布局的問題在于當屏幕尺寸發生改變時它會被 “破壞”。由于這種布局對于簡單的示例應用程序十分有意義,因此我們將使用絕對布局來簡化操作。為此,我們將使用 GUI 屬性。單擊 Layout 選項卡,并將 Layout 的值更改為 Absolute,如圖 7 所示。圖 7. 配置布局接下來,讓我們的主應用程序更大些。為此,只需拖住主窗口的右下角并將其伸展到所需的尺寸。現在我們已經準備好開始向應用程序中添加可視化組件。我們必須能夠在各種用戶之間切換。我們可以提供一個登錄屏幕,要求輸入用戶名和密碼,但是讓我們把事情變得簡單一
25、些。僅使用一個下拉式列表,您可以在其中選擇用戶的登錄身份。可視化設計器的頂部有一個工具欄,該工具欄中包含可以選擇并添加到應用程序中的各種可視化組件。這是一個由選項卡組成的工具欄。我們需要添加控件,那么就選擇 Controls 選項卡。每個控件都有一個直觀的圖標,但是您還可以把鼠標放在每個控件上來查看其名稱。選擇組合框控件并將其拖到我們的主窗口中。這將打開新控件的屬性編輯器,如圖 8 所示。圖 8. 組合框控件的屬性編輯器我們已經將組件的名稱更改為更直觀的名稱(userListCombo),并為其提供了一些默認的用戶文本。單擊 OK,您應當會在應用程序內看到它。現在我們有一種方法可以選擇和更改用
26、戶。當選擇一個用戶時,我們需要哪些操作發生?對于工人,他們應當能夠看到到目前為止已經輸入的所有購買訂單和那些購買訂單的狀態。對于經理,他們需要看到那些待審批的訂單,以便他們可以批準或拒絕訂單。讓我們創建一張表來顯示購買訂單。要添加表,請從工具欄選項卡切換到 Containers 選項卡。查找類似表的圖標并選擇它。選擇表后,您可以使用鼠標將其放置在所需的位置。讓我們把它放在用戶組合框列表下。當您為其選擇位置后,系統將顯示對話框來要求您為表命名。同樣,讓我們使用一個直觀的名稱,因此鍵入 purchaseOrderTable。單擊 OK,您的表應當會顯示在可視化設計器中。您可以通過拖住表的右下角來擴
27、展表使其變得更大。讓我們更進一步地配置表。表的屬性位于 Eclipse 窗口右下角的 GUI Properties 視圖中。單擊 Properties 選項卡并展開屬性的 Expert 列表。通過單擊復選框將 linesVisible 屬性更改為 true,如圖 9 所示。圖 9. 編輯表屬性讓我們把一些列添加到表中。為此,請使用工具欄上的 Containers 選項卡來選擇 Add TableColumn to Table 圖標,緊挨著我們先前選擇的表圖標。現在您可以將 TableColumn 簡單地拖入 purchaseOrderTable,并且這將打開 TableColumn 屬性編輯器
28、。同樣,使用一個描述性名稱 poItemNameColumn,因為此列將 保存已經訂購的條目的名稱。文本將轉到列的標簽中,因此為其鍵入 Item 并單擊 OK。添加完此列后,可視化設計器應當類似圖 10。圖 10. 添加完一列后的可視化設計器此時,您可能還看不到列的名稱。如果是這樣,請通過再次訪問表的 Expert 屬性來修正它。只需單擊表,GUI Properties 將切換回表。打開 Expert 部分查找名為 headerVisible 的屬性,如圖 11 所示。圖 11. 編輯表屬性該屬性有一個復選框,因此可以將其設為 true 或 false。將其切換為 true,現在,您應當會在表
29、中看到表頭和第一列的條目標簽。讓我們繼續并且再添加四列:Price、Quantity、Status 和 ID。完成后,設計器應當類似圖 12。圖 12. 添加到表中的所有列現在可以根據需要顯示所有訂單。我們需要有一種方法來批準或拒絕訂單。讓我們添加幾個按鈕來完成此操作,每個操作對應一個按鈕。要添加按鈕,請切換到工具欄上的 Controls 選項卡并且選擇 Button 控件的圖標。同樣,您可以把按鈕拖到所需的位置。讓我們就把它放在表的下方。釋放它后,系統將顯示按鈕的屬性編輯器對話框。讓我們把第一個按鈕作為批準購買訂單的按鈕,因此我們將把它命名為 approveButton 并為其提供一個文本標
30、簽 Approve。單擊 OK,可視化編輯器應當會顯示新按鈕。類似地,我們將向應用程序中添加 Reject 按鈕。完成后,可視化設計器應當類似圖 13。圖 13. 添加的兩個按鈕您可能會注意到圖中的兩個按鈕并沒有完全對齊。很難用肉眼來對齊按鈕,但是幸運的是,Jigloo 提供了一種輕松的方法可用于對齊組件。只需選中兩個組件 在這種情況下,為兩個按鈕 并使用設計器左側中的樣式工具欄。我們將使用 Align tops of selected elements 按鈕,如圖 14 所示。圖 14. 對齊按鈕按鈕的布局看上去應當會很美觀并且已對齊。Jigloo 可以輕松地讓 GUI 看上去非常專業。現在
31、我們可以選擇用戶、查看購買訂單,甚至批準或拒絕購買訂單。我們需要做的全部操作就是添加一個購買訂單。我們將創建一張表單以輸入新購買訂單的數據。表單將包括與模擬購買訂單所需的各種數據相對應的若干個組件。讓我們對這些組件分組。那將為我們提供一種方法按組來尋找所有組件,這將非常有用。例如,我們可能需要創建它,以便只有某些用戶可以添加新購買訂單。對于這類用戶,我們可能需要使表單不可見。如果表單中的所有元素都被分組到一起,那么就更容易實現我們的需要。要創建此分組,我們將向應用程序中添加 Composite 組件。切換到工具欄中的 Containers 選項卡并選擇 Composite 圖標,如圖 15 所
32、示:圖 15. 使用工具欄添加 Composite將其釋放到所需位置。在應用程序的右側有一大塊空白空間,因此那就是我們要釋放它的位置。這將如預期地打開 Composite 的 Property Editor 對話框,如圖 16 所示:圖 16. Composite 屬性編輯器我們將 Composite 稱為 itemForm,因為那就是它將要保存的內容。確保將其 Layout 更改為 Absolute。那是因為 Composite 可以有自己的 Layout 管理器。單擊 OK 后,您應當會在可視化設計器中看到 Composite,如圖 17 所示:圖 17. 可視化設計器中的 Composi
33、te我們可以通過拖動 Composite 的右下角使其變得更大。讓我們擴展它,以便我們有足夠的空間來添加表單元素。現在讓我們來設計自己的表單。我們的表單將大部分是文本框和標簽。我們將使用工具欄把這些元素添加到表單中。切換到 Controls 選項卡并選擇標簽圖標。正如您所預料的那樣,您可以將此圖標釋放到所需的任意位置。將其放在表單容器的左側頂部。同樣,這將打開普通屬性編輯器,這次是 Label Control 的屬性編輯器,如圖 18 所示:圖 18. Label Control 屬性編輯器您現在應當會在可視化設計器中看到標簽。同樣,您可以通過拖拽它的邊角來調整標簽的大小。有了標簽后,讓我們在
34、它旁邊添加一個文本框以供用戶在購買訂單中輸入條目的名稱。從工具欄中選擇 Text Control。現在,您知道了添加程序:將其釋放到所需位置,然后它將打開自己的屬性編輯器,如圖 19 所示:圖 19. Text Control 屬性編輯器我們給它提供了一個描述性名稱 formItemText。我們還清除了 Text 值。這將用于某種默認值,但是我們實際上不需要該值。現在我們應當在可視化編輯器中看到文本框并且可以調整它的大小。我們將繼續并對另外兩個字段重復執行此過程:Price 和 Quantity。每個字段都將獲得一個標簽和一個文本框。添加后,我們的可視化編輯器應當類似圖 20。圖 20. 添
35、加的 Price 和 Quantity 字段注意,我們提供了數量的默認值為 1。那些都是我們的購買訂單中所需的基本數據元素。現在我們只需要一種方法來提交我們的表單以進行處理。讓我們為此操作添加一個按鈕,其方法和前面一樣,從工具欄中選擇 Button Control 等。這一次讓我們使用另外一種技術。在 Composite 內簡單地右鍵單擊并選擇 Add SWT Object Button,如圖 21 所示:圖 21. 使用上下文菜單添加按鈕這將打開熟悉的屬性編輯器對話框。把組件命名為 addButton 并為其提供文本 Add PO。單擊 OK,我們將在設計器中看到新按鈕,如圖 22 所示:圖
36、 22. 添加的 Add 按鈕這種方法與使用工具欄的最大區別在于我們需要調整它相對于其他控件的位置和對齊情況。這將給我們提供一個機會來使用其他對齊控件。選擇三個文本框和添加按鈕(使用 shift 鍵選擇多個選項),然后單擊 Space selected elements evenly vertically,如圖 23 所示:圖 23. 均勻地垂直分隔元素請大膽地嘗試使用其他一些對齊控件。完成后,最終的 UI 應當類似圖 24。圖 24. 最終的 UI 設計 HYPERLINK /developerworks/cn/education/opensource/os-eclipse-jigloo/s
37、ection3.html l ibm-pcon 回頁首預覽 GUI我們現在有了一個很好的 GUI 界面。它還不能運行,因為我們還沒有把任何數據與它綁定在一起。我們可以非常輕松地完成該操作,但是這是一個利用 Jigloo 的另一項優秀功能 Preview 的好機會。在右側頂部窗口中單擊 Preview。這將打開 GUI 的圖形預覽,如圖 25 所示:圖 25. Workflow GUI 預覽這就是最終應用程序的外觀。您將會注意到的一大特點是這看似一個 Windows 應用程序。那是因為我們使用了基于 Windows 的 SWT。如前所述,它將使用本機小部件。創建應用程序的數據模型如果熟悉典型的模
38、型-視圖-控制器(Model-View-Control,MVC)架構,那么您會認識到目前為止我們所做的操作是創建應用程序的視圖。這是 Jigloo 所擅長的領域之一。在某種程度上,是時候創建模型了。那意味著編寫一些 Java 代碼來讀取并對驅動系統的數據進行操作。Jigloo 同樣擅長于此,但是它可以毫不費力地完成此操作。Jigloo 只是 Eclipse 的一個插件,因此在使用 Jigloo 時您總是能夠使用 Eclipse 的全部功能。由于 Eclipse 非常適于編寫 Java 代碼和使用數據,因此 Jigloo 也非常適于執行這些操作。創建模式如前所述,我們將把數據存儲在 XML 中,
39、并使用 JAXB 從 XML 文件中讀取和向 XML 文件中寫入數據。那意味著我們需要創建一種模式。清單 1. 工作流 XML 模式 我們可以使用 JAXB 創建綁定到與模式相對應的 XML 文件的 Java 類。如果使用的是 Java 6,JAXB 是內置的。如果使用的是 Java 5,則需要從 Sun 下載 JAXB。您需要使用命令行工具 xjc。對于本示例,您將簡單地使用 xjc workflow.xsd。這將觸發模式編譯程序解析 workflow.xsd 并生成類。然后您只需將那些類復制到項目中。讓我們也把模式復制到項目中并為此文件創建 XML 目錄。然后,創建一個樣例 XML 文件。
40、清單 2. 最初的 XML 數據 homer worker bart manager normal 2001-01-01 2001-01-01 stapler A great stapler 2 /homeoffice/gear/61b7/ 21.99 pending 0 添加所有這些人工代碼之后,我們的 Package Explorer 應當類似圖 26(如果有必要,把 JAXB jar 添加到 Java Build Path 中)。圖 26. 添加了 JAXB 類和 XML 文件的 Package Explorer HYPERLINK /developerworks/cn/educatio
41、n/opensource/os-eclipse-jigloo/section4.html l ibm-pcon 回頁首數據訪問您可能注意到了資源管理器中的其他一些文件:WorkflowDao 和 XmlWorkflow。WorkflowDao 是定義處理數據所需操作的接口(參見清單 3)。清單 3. WorkflowDao 接口 package org.developerworks.workflow;import java.util.List;public interface WorkflowDao public List getUsers(); public List getAllOrder
42、s(); public List getAllPendingOrders(); public List getOrdersForUser(int userId); public void saveOrder(PurchaseOrder order); public void setOrderStatus(int orderId, OrderStatus status);我們使用的是典型的數據訪問對象(Data Access Object)模式。我們將簡單地定義接口并編寫該接口的應用程序代碼。在此應用程序中,我們將使用基于 XML JAXB 的實現,但是通過使用這種設計,我們可以輕松地切換到其他
43、實現,例如基于數據庫的實現。我們的接口實現是 XmlWorkflow。清單 4. XmlWorkflow 接口實現 package org.developerworks.workflow;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.InputStream;import java.math.BigInteger;import java.util.ArrayList;impo
44、rt java.util.List;import javax.xml.bind.JAXBContext;import javax.xml.bind.JAXBElement;import javax.xml.bind.JAXBException;import javax.xml.bind.Marshaller;import javax.xml.bind.Unmarshaller;public class XmlWorkflow implements WorkflowDao private static final String DATA_FILE = data.xml; private stat
45、ic XmlWorkflow instance; private Workflow workflow; private XmlWorkflow() try JAXBContext ctx = this.getContext(); Unmarshaller unm = ctx.createUnmarshaller(); File dataFile = this.getDataFile(); InputStream inputStream; if (dataFile.exists() & dataFile.length() 0) inputStream = new FileInputStream(
46、dataFile); else inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(xml/+DATA_FILE); JAXBElement element = (JAXBElement) unm.unmarshal(inputStream); this.workflow = (Workflow) element.getValue(); catch (JAXBException e) e.printStackTrace(); throw new RuntimeException(Fai
47、led to read data file,e); catch (FileNotFoundException e) e.printStackTrace(); throw new RuntimeException(Could not open data file, e); public static XmlWorkflow getInstance() if (instance = null) instance = new XmlWorkflow(); return instance; public List getAllOrders() return this.workflow.getPo();
48、 public List getAllPendingOrders() List allOrders = this.getAllOrders(); List pending = new ArrayList(); for (PurchaseOrder order : allOrders) if (order.getStatus().equals(OrderStatus.PENDING) pending.add(order); return pending; public List getOrdersForUser(int userId) List allOrders = this.getAllOr
49、ders(); List userOrders = new ArrayList(); for (PurchaseOrder order : allOrders) if (order.getSubmittedBy().intValue() = userId) userOrders.add(order); return userOrders; public List getUsers() return this.workflow.getUser(); public void saveOrder(PurchaseOrder order) int index = 0; for (PurchaseOrd
50、er po : this.workflow.getPo() if (po.getId().intValue() = order.getId().intValue() this.workflow.getPo().set(index, order); this.saveData(); return; index+; / add new order order.setId(new BigInteger(Integer.toString(this.workflow.getPo().size(); this.workflow.getPo().add(order); this.saveData(); pu
51、blic void setOrderStatus(int orderId, OrderStatus status) for (PurchaseOrder po : this.workflow.getPo() if (po.getId().intValue() = orderId) po.setStatus(status); this.saveData(); return; private void saveData() File dataFile = this.getDataFile(); try JAXBContext ctx = this.getContext(); Marshaller
52、marshaller = ctx.createMarshaller(); FileOutputStream stream = new FileOutputStream(dataFile); marshaller.marshal(this.workflow, stream); catch (JAXBException e) e.printStackTrace(); throw new RuntimeException(Exception serializing data file,e); catch (FileNotFoundException e) e.printStackTrace(); t
53、hrow new RuntimeException(Exception opening data file); private File getDataFile() String tempDir = System.getProperty(java.io.tmpdir); File dataFile = new File(tempDir + File.separatorChar + DATA_FILE); return dataFile; private JAXBContext getContext() throws JAXBException JAXBContext ctx = JAXBCon
54、text.newInstance(org.developerworks.workflow); return ctx; public static void main(String args) XmlWorkflow dao = XmlWorkflow.getInstance(); List users = dao.getUsers(); assert(users.size() = 2); for (User user : users) System.out.println(User: + user.getUsername() + ID: + user.getId(); List orders
55、= dao.getAllOrders(); assert(orders.size() = 1); for (PurchaseOrder order : orders) System.out.println(Order: + order.getItemName() + ID: + order.getId() + Status: + order.getStatus(); PurchaseOrder order = orders.get(0); order.setStatus(OrderStatus.APPROVED); order.setProcessedBy(new BigInteger(1);
56、 dao.saveOrder(order); 注意,我們最初是從樣例文件中讀取數據,但是我們將把更改保存到名為 data.xml 的文件,該文件將被存儲到系統臨時目錄中。雖然那不是存放數據最安全的位置,但是該位置對于此樣例應用程序非常合適。您還會注意到在這個類中有一個簡單的主方法。這將允許進行 JAXB 機制的簡單單元測試。此外,如果使用的是 Java 5,您將需要把 JAXB jar 添加到項目的類路徑中。您可能希望繼續并將 JAXB jar 復制到項目中,或者可以在項目外的某一個位置引用 JAXB jar。 HYPERLINK /developerworks/cn/education/op
57、ensource/os-eclipse-jigloo/section4.html l ibm-pcon 回頁首初始化應用程序我們需要先進行初始化,然后才能與我們的應用程序進行交互。首先需要聲明一些模型對象以在應用程序內使用。只需將清單 5 中的行添加到 WorkflowMain 的成員變量聲明中。清單 5. 聲明的模型對象 / Data Model Objects private java.util.List users; private User user; / Service Object private WorkflowDao dao = XmlWorkflow.getInstance(
58、);要訪問代碼,請右鍵單擊 Workflow.java 文件并選擇 Open With Java Editor。我們將修改應用程序的 initGUI() 方法的代碼。我們將創建一個私有方法來初始化用戶列表。清單 6. 創建用戶方法 private void initUserList() this.users = dao.getUsers(); for (User u : users) this.userListCombo.add(u.getUsername(); 在 initGUI() 中定義 userListCombo 之后調用此方法。清單 7. 調用用戶方法 userListCombo =
59、 new Combo(this, SWT.NONE); userListCombo.setText(Users); userListCombo.setBounds(28, 35, 105, 21); this.initUserList(); HYPERLINK /developerworks/cn/education/opensource/os-eclipse-jigloo/section4.html l ibm-pcon 回頁首使用事件把視圖與模型綁定在一起我們有視圖也有模型,因此我們只需把它們綁定在一起。我們需要使用控制器。SWT(和 Swing)使用了一項幾乎所有 UI 框架都使用的簡單
60、技術:它們就是事件驅動系統。我們將使用事件來獲悉模型上何時發生調用操作和修改視圖。讓我們返回到可視化設計器。第一個需要與模型關聯起來的 UI 事件是從用戶組合框列表中選中一個用戶時。選擇組合框控件并切換到 GUI Properties 視圖的 Events 選項卡中,如圖 27 所示:圖 27. 訪問組合框控件事件您將看到針對組合框控件的幾個偵聽程序。我們將采用 SelectionListener。只要在組合框控件中做出選擇,此偵聽程序將觸發 SelectionEvent。我們可以選擇用一種匿名方法內嵌處理它,也可以定義一個處理事件的方法。我們將選擇后者。這將導致代碼編輯器顯示生成的方法 us
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 山東省棗莊達標名校2025年初三5月基礎測試數學試題含解析
- 上海市閔行區達標名校2024-2025學年初三5月學段考試語文試題含解析
- 鉛錠購銷合同
- 遼寧省撫順縣2018-2019學年八年級上學期期末模擬檢測物理試題【含答案】
- 信息技術專業服務承包合同
- 網約車平臺車牌照租賃合同范本
- 電子郵箱服務提供商合同
- 舞蹈常用術語
- 華貴大氣的牡丹動態模板
- 愛麗斯特元宵歡樂嘉年華活動策劃
- 風力發電勞務施工合同
- 部編版歷史八年級下冊第四單元 第14課《海峽兩岸的交往》說課稿
- GB/T 30595-2024建筑保溫用擠塑聚苯板(XPS)系統材料
- 《中華人民共和國突發事件應對法》知識培訓
- 《智能家居系統》課件
- 胖東來企業文化指導手冊
- 注射相關感染預防與控制(全文)
- 古詩閱讀賞析泊船瓜洲
- 熔斷器安裝施工方案
- 中深層無干擾地熱供熱系統應用技術規程
- 六年級下冊美術教學設計-第3課《記錄色彩》人教新課標
評論
0/150
提交評論