bs結構下的oa流程可視化的研究與實現(xiàn)——畢業(yè)論文_第1頁
已閱讀1頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  成都信息工程學院</b></p><p><b>  學位論文</b></p><p>  B/S結構下的OA流程可視化的研究與實現(xiàn)</p><p>  B/S結構下的OA流程可視化的研究與實現(xiàn)</p><p><b>  摘 要</b><

2、/p><p>  工作流是指整個或部分業(yè)務流程在計算機支持下的全自動或半自動化。在計算機網(wǎng)絡環(huán)境下,工作任務在多個人或單位之間的流轉實際上將表現(xiàn)為信息或數(shù)據(jù)在多個人之間的傳送。使用可視化的OA工作流設計工具,用戶不需要編程就可以定義設計出滿足要求的收發(fā)文流程,實際使用效果良好。論文以可視化的OA工作流設計工具的開發(fā)為基礎,主要闡述五個方面的內容。第一部分介紹了工作流和工作流設計工具的相關概念與開發(fā)背景;第二部分對工作

3、相關基礎理論技術、系統(tǒng)環(huán)境與平臺基礎、以及開發(fā)技術進行了描述;第三部分對系統(tǒng)功能進行了分析;第四部分詳細介紹了系統(tǒng)流程、流程可視化設計的實際開發(fā)過程中使用到的關鍵技術;最后一部分在總結了系統(tǒng)開發(fā)心得的同時,提出了目前系統(tǒng)存在的不足和有待改進的地方。</p><p>  關鍵詞:工作流;流程定義;可視化;Java Applet</p><p>  The Research and Imple

4、mentation of Visual OA workflow Based on B/S Structure</p><p><b>  Abstract</b></p><p>  Workflow is a full automation or semi-automation on business process, which is supported by t

5、he computer technology. In the distributed environment, tasks transferred among different persons and departments are information or data passed among participants according to the defined set of rules. Using visual OA w

6、orkflow designing tools, users can define and design receiving and ending document workflow without programming. The actual result is very satisfactory. This paper is based on the develop</p><p>  Key words:

7、 workflow;flow define;visual;Java Applet</p><p><b>  目 錄</b></p><p><b>  論文總頁數(shù):30頁</b></p><p><b>  1 引言1</b></p><p>  1.1 課題背景1&l

8、t;/p><p>  1.2 技術可行性研究1</p><p>  1.2.1 Java Applet技術的可行性研究1</p><p>  1.2.2 XML技術的可行性研究1</p><p>  1.2.3 Microsoft Office Access 2003數(shù)據(jù)庫的可行性研究1</p><p>  2 相

9、關基礎理論技術以及開發(fā)技術1</p><p>  2.1工作流的定義與存在問題描述2</p><p>  2.1.1 OA中工作流的定義2</p><p>  2.1.2工作流中的流程定義問題3</p><p>  2.2 java applet和applet繪圖技術的介紹3</p><p>  2.2.1

10、applet的介紹3</p><p>  2.2.2 Applet的AWT繪制4</p><p>  2.3系統(tǒng)環(huán)境與平臺基礎5</p><p>  3 系統(tǒng)需求分析與總體設計5</p><p>  3.1系統(tǒng)需求分析5</p><p>  3.2 系統(tǒng)功能介紹5</p><p> 

11、 3.3 系統(tǒng)模塊功能和設計思想6</p><p>  3.4數(shù)據(jù)庫設計7</p><p>  3.4.1 E-R圖設計7</p><p>  3.4.2 表的構建8</p><p>  3.4.3 數(shù)據(jù)庫連接實現(xiàn)9</p><p>  4 系統(tǒng)功能模塊實現(xiàn)9</p><p>  4

12、.2流程可視化設計實現(xiàn)10</p><p>  4.2.1界面可視化10</p><p>  4.2.2 繪圖功能設計11</p><p>  4.2.3 流程圖保存和讀取方法設計17</p><p>  4.2.4 節(jié)點間關系保存的實現(xiàn)23</p><p>  5 系統(tǒng)測試結果及存在的問題和改進的方案27

13、</p><p><b>  結 論28</b></p><p><b>  參考文獻28</b></p><p><b>  致 謝29</b></p><p><b>  聲 明30</b></p><p&

14、gt;<b>  1 引言</b></p><p><b>  1.1 課題背景</b></p><p>  辦公自動化(OA-Office Automation)是將現(xiàn)代化辦公和計算機網(wǎng)絡功能結合起來的一種新型的辦公方式,通過網(wǎng)絡,組織機構內部的人員可跨越時間、地點協(xié)同工作。OA中涉及到諸多業(yè)務流程,流程的定義對與OA系統(tǒng)中業(yè)務的自動流轉具有十

15、分重要的意義,但是在一般B/S模式下的OA系統(tǒng),對于流程的定義都是文字型或者表單形式的,而不是圖形化的,因為基于HTML解析的B/S在繪圖方面存在缺陷,因此大多B/S的OA系統(tǒng)在流程定義時,為了達到可視化的效果,都采用了流程定義用C/S來輔助。但是java中的applet技術可以實現(xiàn)在B/S下的繪圖,因此,結合applet技術,可以在B/S系統(tǒng)中直接嘗試流程的可視化定義研究。</p><p>  1.2 技術可行

16、性研究</p><p>  在對可視化流程設計工具的研究和實現(xiàn)過程中一共用到了三種技術:Java Applet、XML、Microsoft Office Access2003。在技術難度方面,由于有指導老師的指導和相關的參考文獻,使得在開發(fā)過程中所遇到的困難都能夠一一得到解決。</p><p>  1.2.1 Java Applet技術的可行性研究</p><p>

17、  本系統(tǒng)利用Java Applet作為開發(fā)工具,是因為成熟的Java技術采用面向對象的編程方法——把程序和數(shù)據(jù)封裝起來作為一個對象,并為每個對象賦予相應的屬性。而Java Applet具有能嵌入到瀏覽器中運行,能通過可視化技術手段實現(xiàn)繪圖功能,能連接數(shù)據(jù)庫服務器和應用服務器等這些特點,完全滿足了此次B/S結構下OA流程可視化研究和實現(xiàn)的各種要求。</p><p>  1.2.2 XML技術的可行性研究</

18、p><p>  “可擴展標記語言”(XML) 提供一種描述結構化數(shù)據(jù)的方法。與主要用于控制數(shù)據(jù)的顯示和外觀的 HTML 標記不同,XML 標記用于定義數(shù)據(jù)本身的結構和數(shù)據(jù)類型。利用XML技術可實現(xiàn)將繪制圖形中的節(jié)點關系和圖形信息保存在XML文件中并通過XML文件提供上層接口服務的功能。</p><p>  1.2.3 Microsoft Office Access 2003數(shù)據(jù)庫的可行性研究&

19、lt;/p><p>  系統(tǒng)采用Microsoft Office Access 2003作為開發(fā)數(shù)據(jù)庫,使用于中度規(guī)模的數(shù)據(jù)錄入要求。它通過工具界面所提供的組件輸入數(shù)據(jù)到數(shù)據(jù)庫,可以使用查詢設計和SQL實現(xiàn)查詢并生成報表。</p><p>  2 相關基礎理論技術以及開發(fā)技術</p><p>  2.1工作流的定義與存在問題描述</p><p>

20、  2.1.1 OA中工作流的定義</p><p>  當今社會分工越來越細,在一個單位內部也越來越強調專業(yè)化,大部分工作都需要多個部門和員工合作完成。一個制度良好的單位往往對各種工作的工作流程以文件的形式固定下來,即使是管理不太正規(guī)的單位也有約定俗成的工作步驟。這種工作流程保證了一件任務能按預定的順序從起點流向終點,并且在需要的時候可以跟蹤、查詢和統(tǒng)計。</p><p>  工作流(wo

21、rkflow)的概念是為提高工作效率的研究而產(chǎn)生的,目前尚無統(tǒng)一、明確的定義。工作流管理聯(lián)盟(WorkFlow Management Coalition ,WFMC)將工作流定義為:業(yè)務流程的全部或部分自動化,在此過程中,文檔、信息或者任務按照一定的過程規(guī)則流轉,實現(xiàn)組織成員間的協(xié)調工作以期達到業(yè)務的整體目標。</p><p>  工作流包括以下幾個要素:</p><p>  實體(Ent

22、ity):是工作流的主體,是需要隨著工作流一起流動的物件(Object)。例如,在一個采購申請批準流程中,實體就是采購申請單;在公文審批流程中,實體就是公文。</p><p>  參與者(Participant):是各個處理步驟中的責任人,可能是人,也可能是某個職能部門,還可能是某個自動化的設備;</p><p>  流程定義(Flow Definition):是實現(xiàn)某工作目標而要完成的一

23、系列步驟的描述。它包含了所有使業(yè)務過程能被工作流執(zhí)行服務的必要信息。這些信息包含起始和終止條件、各個組成活動、活動調度規(guī)則、各業(yè)務的參與和需要做的工作、相關應用次序和數(shù)據(jù)的調用信息等。過程由活動和相關數(shù)據(jù)組成。</p><p>  流程定義工具被用來創(chuàng)建計算機可處理的業(yè)務過程描述。它可是形式過程定義語言或對象關系模型,也可以是簡單地規(guī)定用戶間信息傳輸?shù)囊唤M路由命令。</p><p>  在

24、本論文中所研究的可視化流程設計工具就是一種通過Java 語言實現(xiàn)的利用圖形來定義業(yè)務流程模型的一種工具。</p><p>  WFMC對工作流有一個簡化的定義由一個四元組{Pt,Pa,Dt,Ti}對其進行描述:</p><p>  1)工作流參與者(Workflow Participant):定義活動的執(zhí)行者,執(zhí)行者可以是人和其他實體。</p><p>  2)工作

25、流過程活動(Workflow Process Activity):定義工作流活動的執(zhí)行步驟,它可分為原子活動和子工作流過程。前者不可再分,后者可由原子活動和其他子工作流組成。</p><p>  3)工作流相關數(shù)據(jù)(Workflow Relevant Data):定義工作流活動和應用所涉及的數(shù)據(jù)信息,它們可能包含系統(tǒng)和環(huán)境數(shù)據(jù)。</p><p>  4)躍遷信息(Transition In

26、formation):定義工作流活動執(zhí)行的依賴信息,決定活動之間的躍遷、一個活動的完成可能對其他活動的執(zhí)行產(chǎn)生影響。</p><p>  下面給出一個例子,并用上面的定義的規(guī)范進行分解:</p><p>  Pt = {擬稿人(處員)A,處室領導B,處室會簽負責人C,領導D,核稿人E,打字員F,檔案室G}</p><p>  Pa = {擬稿a,送審b,送核稿c,審

27、核d,寫審核意見e,送會簽f,會簽意見g,返回擬稿人h,寫核稿意見i,送領導批示j,編號k,送打字室l,寫批示意見m,返回核稿人n,排版印刷o,封發(fā)p,送檔案室q,歸檔r}</p><p><b>  Dt = {文件}</b></p><p>  Ti = {Pt(i):->t Pt(j)}表示從一個狀態(tài)到達另一個狀態(tài),t 是觸發(fā)條件,</p>

28、<p>  這些定義和例子將是我們通過流程設計工具設計流程時的參考。</p><p>  2.1.2工作流中的流程定義問題</p><p>  在一般B/S模式下的OA系統(tǒng),對于流程的定義都是文字型或者表單形式的,而不是圖形化的,因為基于HTML解析的B/S在繪圖方面存在缺陷,因此大多B/S的OA系統(tǒng)在流程定義時,為了達到可視化的效果,都采用了流程定義用C/S來輔助。而java中

29、的applet技術恰恰可以實現(xiàn)在B/S下的繪圖,因此結合applet技術可以在B/S系統(tǒng)中直接嘗試流程的可視化定義研究。</p><p>  如何將上一小節(jié)的工作流定義轉變成B/S結構下的OA系統(tǒng)可以具體運行的程序?首先在數(shù)據(jù)庫中設計一組表單作為狀態(tài)的模板,用一XML文檔來保存流程圖形的狀態(tài),所有XML 文檔保存在一個數(shù)據(jù)庫XML表中。上層接口通過讀取并解釋數(shù)據(jù)庫中的XML文件來實現(xiàn)工作流程。來如何設計出有效的可

30、視化流程設計工具是本文的重點。</p><p>  2.2 java applet和applet繪圖技術的介紹</p><p>  2.2.1 applet的介紹</p><p>  Applet是使用Java語言編寫,可以在瀏覽器環(huán)境中運行的小應用程序。它與Application的區(qū)別主要在于其執(zhí)行方式的不同。application 是從其中的main() 方法開

31、始運行的,而Applet 是在瀏覽器中運行的。首先必須創(chuàng)建一個HTML 文件,通過編寫HTML語言代碼告訴瀏覽器載入何種Applet 以及如何運行。就因為applet能在瀏覽器里運行的這一特點,滿足了B/S結構下的瀏覽器界面的需求,所以我們?yōu)檫x擇了applet作為可視化OA工作流程設計工具的開發(fā)工具。 </p><p>  小應用程序的生命周期相對于Application而言較為復雜。在其生命周期中涉及到Appl

32、et類的四個方法(也被JApplet類繼承):init()、start()、stop()和destroy()。</p><p>  Applet的生命周期中有四個狀態(tài):初始態(tài)、運行態(tài)、停止態(tài)和消亡態(tài)。當程序執(zhí)行完init()方法以后,Applet程序就進入了初始態(tài);然后馬上執(zhí)行start()方法,Applet程序進入運行態(tài);當Applet程序所在的瀏覽器圖標化或者是轉入其它頁面時,該Applet程序馬上執(zhí)行sto

33、p()方法,Applet程序進入停止態(tài);在停止態(tài)中,如果瀏覽器又重新裝載該Applet程序所在的頁面,或者是瀏覽器從圖標中復原,則Applet程序馬上調用start()方法,進入運行態(tài);當然,在停止態(tài)時,如果瀏覽器關閉,則Applet程序調用destroy()方法,進入消亡態(tài)。</p><p>  2.2.2 Applet的AWT繪制 </p><p>  Applet程序中所采用的AWT

34、的繪圖機制主要涉及三個方法:paint()方法、update()方法和repaint()方法,update()方法和paint()方法都有一個Graphics類參數(shù)。Graphics是畫圖的關鍵,它可以支持兩種繪圖:一種是基本的繪圖,如:畫線、矩形、圓等;另一種是畫圖象,主要用于動畫制作。 </p><p>  要進行繪圖,首先要找到一個Graphics類的對象。update()方法和paint()方法所傳遞的參

35、數(shù)都是Graphics類的對象,因此主要是通過重載它們來進行繪圖,這是在動畫程序中經(jīng)常使用的方法。我們還可以通過getGraphics()方法得到一個Graphics類的對象,這個對象和update()方法和paint()方法中所傳遞的對象一樣,都是該成員所對應的Graphics類的對象。得到了Graphics類的對象,就可使用各種繪圖方法。 </p><p>  Graphics中提供的圖形繪制方法有: <

36、;/p><p>  paint( ) //進行繪圖的具體操作,必須有程序員重寫 </p><p>  update( ) //用于更新圖形,先清除背景、前景,再調用paint() </p><p>  repaint( ) /*用于重繪圖形,在組件外形發(fā)生變化,即大小改變或位置移動時,repaint( )方法立即被系統(tǒng)自動調用,而實際上repaint()方法是自動調用u

37、pdate()方法*/ </p><p>  下面的方法支持基本的繪圖和畫圖像: </p><p>  void drawLine( ) //畫直線,void drawArc( ) //畫弧線,</p><p>  void drawPolygon( ) //畫多邊形,void drawRect( ) //畫矩形,</p><p>  vo

38、id drawRoundRect( ) //畫帶有圓角的矩形,</p><p>  void fill3DRect( ) //畫三維矩形,</p><p>  void fillOval( ) //畫橢圓,</p><p>  這些方法都是來自于java.awt.Graphics類 </p><p>  2.3系統(tǒng)環(huán)境與平臺基礎</

39、p><p>  OA可視化工作流設計工具在Java環(huán)境基礎上,后臺以Microsoft Office Access 2003為數(shù)據(jù)庫平臺,前臺采用具有較強跨平臺性的Java Applet開發(fā)。具體環(huán)境描述如下:Microsoft Windows Server 2003;Microsoft Office Access 2003;jdk1.5.0_09;Eclipse 3.1。</p><p> 

40、 3 系統(tǒng)需求分析與總體設計</p><p><b>  3.1系統(tǒng)需求分析</b></p><p>  在最近幾年的各級單位的信息化改造建設中,隨著信息化基礎設施建設的逐漸完備,各類應用系統(tǒng)開始受到各級單位的重視,開發(fā)重點主要側重于人事信息數(shù)字化、文書信息化、公文流轉、交互式審批等信息化可行性高的工作領域。 因此,改革傳統(tǒng)辦公模式,開展電子辦公,使業(yè)務辦公、公文流轉

41、和管理過程電子化、信息化,并通過統(tǒng)一辦公規(guī)范,提高工作效率降低辦公成本,實現(xiàn)辦公自動化已勢在必行。 </p><p>  而上述所介紹的公文流轉的一個重要特征就是流程復雜,難以用標準的程序化語言解釋,因而公文流轉系統(tǒng)必須有與之相適應的工作流程定義系統(tǒng),使操作人員能夠自主地設定公文流轉流程。為此我們設計了一個可視化流程設計工具,該工具可以作為工作流管理系統(tǒng)里的一個模塊。它具有圖形用戶界面,用戶定義與任務執(zhí)行完全分離

42、,其體系結構基本上符合WFMC 標準結構。用戶不需要程序員的支持就可以定義和設計出工作流程模型,根據(jù)該模型生成的文件可以非常方便地被解釋為上層接口所需的工作流。</p><p>  3.2 系統(tǒng)功能介紹</p><p>  可視化OA工作流程設計工具針對用戶的要求對工作流程進行定制和維護,主要包括:對接點、接點連接線可自由拖放。具備刪除節(jié)點、節(jié)點之間連接線功能。接點之間采用箭頭連接。接點采

43、用矩形表示。圖形內容利用XML形式保存于的Access數(shù)據(jù)庫中,可查詢,編輯,保存,更多自定義屬性。</p><p>  通過對用戶需求的分析,要求本流程設計工具具有以下功能: </p><p>  (1)可視化的操作界面;</p><p>  (2)可以對流程節(jié)點和弧線進行填加、修改、刪除操作; </p><p>  (3)工作流程支持串

44、簽、會簽和分支流程;</p><p>  (4)可以將圖形內容保存于access數(shù)據(jù)庫或(xml)中,可查詢,編輯,保存;</p><p>  (5)可以通過流程模型解釋接口和引擎主程序提供給上層程序使用</p><p>  3.3 系統(tǒng)模塊功能和設計思想</p><p>  1994年11月,工作流管理聯(lián)盟發(fā)布了工作流管理系統(tǒng)的參考模型,該

45、模型定義了一個基本的工作流管理系統(tǒng)所需要的6個基本模塊:過程定義工具,工作流執(zhí)行服務,其他工作流執(zhí)行服務,客戶應用程序,被調應用程序,管理及監(jiān)控工具;并制定了個模塊之間的接口標準。</p><p>  流程設計工具與其系統(tǒng)交互的簡單模塊關系圖:</p><p>  圖1 流程設計工具與其系統(tǒng)交互的簡單模塊關系圖</p><p>  圖2 可視化流程設計工具的系統(tǒng)

46、關系圖</p><p>  可視化流程設計工具各模塊的功能描述和設計思想介紹:</p><p>  (1)繪圖模塊:可將需要設計的流程用此模塊畫出,利用java.awt來繪制節(jié)點和弧線;</p><p>  (2)圖象關系序列化模塊:可將已畫出流程中的節(jié)點和弧線序列化,利用接口java.io.Serializable就能實現(xiàn);</p><p>

47、;  (3)圖象關系保存模塊:可將序列化后的節(jié)點和弧線關系保存起來供上層流程定義解釋器使用。</p><p><b>  3.4數(shù)據(jù)庫設計</b></p><p>  3.4.1 E-R圖設計</p><p>  實體關系圖(E-R圖)將系統(tǒng)中的數(shù)據(jù)模型以一種更加清楚、具體的方式展現(xiàn)出來。圖中方框代表實體,橢圓代表實體的屬性,實體和實體之間的關

48、系用菱形來表示。</p><p>  在工作流管理系統(tǒng)中,上層程序需要通過讀取保存在數(shù)據(jù)庫里流程的XML文件來實現(xiàn)流程的解釋和實例化。在對工作流進行定義的工作中用到的E-R如下圖所示: </p><p><b>  圖3 E-R圖</b></p><p>  3.4.2 表的構建</p><p>  表1 流程節(jié)點表(

49、flow_Node)</p><p>  表2 流程表(flowdata)</p><p>  3.4.3 數(shù)據(jù)庫連接實現(xiàn)</p><p>  public Connection getConnection(){</p><p>  // now we can get the connection from the DriverManag

50、er</p><p>  Connection con = null;</p><p><b>  try {</b></p><p>  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); </p><p>  //驅動 set this to a MS

51、Access DB you have on your machine</p><p>  String filename = "/fileData.mdb";</p><p>  String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=";</p>

52、<p>  database+= filename.trim() + ";DriverID=22;READONLY=true}"; </p><p>  // add on to the end </p><p>  con = DriverManager.getConnection( "jdbc:odbc:ccos" ,"

53、","");</p><p><b>  //數(shù)據(jù)源 </b></p><p>  } catch (ClassNotFoundException e) {</p><p>  // TODO Auto-generated catch block</p><p>  e.printStack

54、Trace();</p><p>  } catch (SQLException e) {</p><p>  // TODO Auto-generated catch block</p><p>  e.printStackTrace();</p><p><b>  } </b></p><p&g

55、t;  return con;</p><p><b>  } </b></p><p>  4 系統(tǒng)功能模塊實現(xiàn)</p><p>  4.1系統(tǒng)流程及圖示</p><p>  一個流程的設計是先通過繪圖來對實際業(yè)務過程進行分析、建模,然后通過一定的技術生成所建立流程模型的可被上層接口處理的形式化描述。其流程如下圖:&l

56、t;/p><p><b>  圖4 系統(tǒng)流程圖</b></p><p>  4.2流程可視化設計實現(xiàn)</p><p>  4.2.1界面可視化</p><p>  這是工具開始運行出現(xiàn)的第一個界面,由Internet Explorer瀏覽器打開,可以適應B/S結構的OA系統(tǒng)。</p><p>  圖

57、5 工具可視化界面</p><p>  界面的布局由BorderLayout來實現(xiàn),分北部、西部、中部三部分。</p><p><b>  包括:</b></p><p>  北部 控制板(ArcControls);</p><p>  西部 繪圖工具板(ToolBlank);</p><p> 

58、 中部 繪圖畫板 (ArcCanvas)。</p><p><b>  具體代碼實現(xiàn)如下:</b></p><p>  this.setLayout(borderLayout1);</p><p>  this.add(ArcControls,BorderLayout.NORTH);</p><p>  this.add

59、(ArcCanvas,BorderLayout.CENTER);</p><p>  this.add(ToolBlank, BorderLayout.WEST);</p><p>  4.2.2 繪圖功能設計 </p><p>  當設計一個流程時,用戶點擊繪圖工作板中的繪制節(jié)點和繪制弧線兩個按鈕結合著選擇環(huán)節(jié)名,將指定的可視化部件拖

60、拉繪制在工作平臺上,每一個可視化部件代表一個角色,用流向箭頭將各個部件關聯(lián)起來。還可以對節(jié)點和弧線進行修改和刪除。</p><p>  一個矩形節(jié)點的繪制,需要對它的各項屬性進行定義,包括對它的起點坐標、矩形的寬和高、矩形的邊框坐標。以下是節(jié)點定義的簡單描述: </p><p>  public class Node extends BaseObject{</p><p

61、>  int LeftUpNodeX;//定義頂點坐標</p><p>  int LeftUpNodeY;</p><p>  private int starx; //定義起始點,高,寬</p><p>  private int stary;</p><p>  private int Heigh;</p><

62、;p>  private int Width;</p><p>  private int MinX; //定義邊框</p><p>  private int MinY;</p><p>  private int MaxX;</p><p>  private int MaxY;</p><p>  Col

63、or color; //定義外框顏色</p><p>  String NodeName="";//節(jié)點名稱</p><p><b>  }</b></p><p><b>  繪制節(jié)點:</b></p><p>  g.drawRect(this.starx,this.sta

64、ry,this.Width,this.Height);//畫矩形</p><p>  g.drawString(this.NodeName,this.starx+this.Width/3,this.stary+Height/2);//畫節(jié)點名</p><p><b>  拖動節(jié)點:</b></p><p>  public void SetNo

65、deMoved(int x,int y){</p><p>  this.starx = x;</p><p>  this.stary = y;</p><p>  this.MinX = starx;</p><p>  this.MinY = stary;</p><p>  this.MaxX = starx

66、+ Width;</p><p>  this.MaxY = stary + Height;</p><p><b>  }</b></p><p>  拖動節(jié)點時鼠標動態(tài):</p><p>  public void mouseDragged(MouseEvent e) { //鼠標拖動</p><

67、p>  int x = e.getX();</p><p>  int y = e.getY();</p><p>  switch(status){</p><p><b>  case 1:</b></p><p>  if (this.NodeIFinit == true) {</p><

68、p>  node = new Node(e.getX(), e.getY(),CurrentNodeName);</p><p>  this.NodeObject.add(node);</p><p>  this.IfDrag = true;</p><p>  this.NodeIFinit = false;</p><p>  

69、repaint();</p><p><b>  }</b></p><p><b>  else {</b></p><p>  if (IfDrag == true) {</p><p>  if (node != null) {</p><p>  node.SetHe

70、ightAndWidth(x, y);</p><p>  repaint();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else {</b></p><p>  if (SelectN

71、odeDrag == true) {</p><p>  node.SetNodeMoved(x, y);</p><p>  node.DrawMyself(this.getGraphics());</p><p>  repaint();</p><p><b>  }</b></p><p>

72、;<b>  }</b></p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>

73、;  節(jié)點與節(jié)點之間需要用弧線進行連接。一段弧線需要對它的起點坐標、終點坐標等屬性進行定義。以下是弧線定義的簡單描述:</p><p><b>  弧線定義:</b></p><p>  public class Arc {</p><p>  private int endx; //結束坐標</p><p>  pri

74、vate int endy;</p><p>  private int startx;//起點坐標</p><p>  private int starty;</p><p>  private int[] SelectedNode = new int[2];//選擇節(jié)點</p><p>  private Vector Point;//點

75、元素</p><p>  private Color color;</p><p>  private boolean ArcEnd;//判斷弧段是否結束增加節(jié)點</p><p>  public Arc(int x,int y) {</p><p>  Point = new Vector();</p><p>  

76、int[] star = new int[2];//點由2元素(x,y)組成</p><p>  star[0] = x;</p><p>  star[1] = y;</p><p>  this.startx = x;</p><p>  this.starty = y;</p><p>  this.Point.

77、addElement(star);</p><p>  this.color = Color.BLACK;</p><p>  this.ArcEnd = false;</p><p><b>  }</b></p><p><b>  繪制弧線:</b></p><p> 

78、 public void DrawMyself(Graphics g){</p><p>  int length = Point.size();</p><p>  g.setColor(color);</p><p>  if (length > 0) {</p><p>  System.out.println("Arc

79、 node size:" + length);</p><p>  if (length == 1) { }</p><p><b>  else {</b></p><p>  for (int i = 0; i < length - 1; i++) {</p><p>  int[] Spoint =

80、 (int[]) Point.elementAt(i);</p><p>  int[] Epoint = (int[]) Point.elementAt(i + 1);</p><p>  g.drawLine(Spoint[0], Spoint[1], Epoint[0], Epoint[1]);</p><p><b>  }</b>&l

81、t;/p><p><b>  弧線拖動:</b></p><p>  public void mouseDragged(MouseEvent e) { //鼠標拖動</p><p>  int x = e.getX();</p><p>  int y = e.getY();</p><p>  s

82、witch(status){ </p><p><b>  case 3:</b></p><p>  if (SelectArcDrag == true) {</p><p>  if ( (arc != null) && (arcNodeindex != -1)) {</p><p>  arc.Se

83、tSelectedNode(arcNodeindex, x, y);</p><p>  repaint();</p><p>  }else if((arc != null)&&(arcNodeindex == -1)){//選中的是最后一個不再Vetor里面的點</p><p>  arc.SetSelectedNode(x, y);</p

84、><p>  repaint();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><

85、p><b>  }</b></p><p><b>  畫箭頭:</b></p><p>  int[] lastpoint = (int[]) Point.elementAt(length - 1);</p><p>  g.drawLine(lastpoint[0], lastpoint[1], this.end

86、x, this.endy); //畫箭頭</p><p>  if((lastpoint[0] == endx)&&(lastpoint[1]<endy))//開口向下</p><p><b>  {</b></p><p>  g.drawLine(endx,endy,endx+3,endy-3);</p>

87、<p>  g.drawLine(endx,endy,endx-3,endy-3);</p><p>  }else if((lastpoint[0] == endx)&&(lastpoint[1]>endy)){ //開口向上</p><p>  g.drawLine(endx,endy,endx+3,endy+3);</p><p&

88、gt;  g.drawLine(endx,endy,endx-3,endy+3);</p><p>  }else if((lastpoint[1] == endy)&&(lastpoint[0]>endx)){//開口向左</p><p>  g.drawLine(endx,endy,endx+3,endy-3);</p><p>  g.d

89、rawLine(endx,endy,endx+3,endy+3);</p><p>  }else if((lastpoint[1] == endy)&&(lastpoint[0]<endx)){//開口向右</p><p>  g.drawLine(endx,endy,endx-3,endy-3);</p><p>  g.drawLine(

90、endx,endy,endx-3,endy+3);</p><p>  }else{//任意方向用點代替</p><p>  g.fillOval(endx-2,endy-2,5,5);</p><p><b>  }</b></p><p>  if ( (SelectedNode[0] != 0) &&

91、; (SelectedNode[1] != 0)) {</p><p>  g.setColor(Color.BLUE);</p><p>  g.fillOval(SelectedNode[0]-2,SelectedNode[1]-2,5,5);</p><p><b>  }</b></p><p><b>

92、;  刪除節(jié)點:</b></p><p>  public void DeleteSelectedNode() {</p><p>  if (haveSelectedNode == true) {</p><p>  this.NodeObject.removeElementAt(nodeindex);</p><p>  th

93、is.haveSelectedNode = false;</p><p>  repaint();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  刪除弧線 : </b></p><p>  p

94、ublic void DeleteSelectedArc() {</p><p>  if (haveSelectedArc == true) {</p><p>  this.ArcObject.removeElementAt(arcindex);</p><p>  this.haveSelectedArc = false;</p><p&g

95、t;  repaint();</p><p><b>  }</b></p><p><b>  }</b></p><p>  下圖為一設計好了的流程圖:</p><p>  圖6 一個設計好的工作流程圖</p><p>  4.2.3 流程圖保存和讀取方法設計</

96、p><p>  將序列化后的節(jié)點與弧線的對象保存為xml文件,易于保存和重繪。</p><p>  序列化是將對象寫到流中,序列化需要對象實現(xiàn)Serializable接口,序列化后能將對象轉換成一系列字節(jié),并可在以后完全復原。序列化可以實現(xiàn)“有限持久化”。</p><p>  在保存前先要對已經(jīng)繪出的節(jié)點以及弧線進行屬性采集,我們用一個NodeBean以及ArcBean

97、方法來實現(xiàn)其功能,NodeBean的代碼描述如下:</p><p>  public class NodeBean implements java.io.Serializable{}</p><p>  public NodeBean(){</p><p><b>  }</b></p><p>  String Lef

98、tUpNodeX; //定義頂點坐標</p><p>  String LeftUpNodeY;</p><p>  private String MinX;//定義邊框</p><p>  private String MinY;</p><p>  private String MaxX;</p><p>  pr

99、ivate String MaxY;</p><p>  Color color; //定義外框顏色</p><p>  String NodeName="";//節(jié)點名稱</p><p>  public String getNodeName() {</p><p>  return NodeName;</p>

100、;<p><b>  }</b></p><p>  public void setNodeName(String nodeName) {</p><p>  NodeName = nodeName;</p><p><b>  }</b></p><p>  public Color

101、 getColor() {</p><p>  return color;</p><p><b>  }</b></p><p>  public void setColor(Color color) {</p><p>  this.color = color;</p><p><b&g

102、t;  }</b></p><p>  public String getLeftUpNodeX() {</p><p>  return LeftUpNodeX;</p><p><b>  }</b></p><p>  public void setLeftUpNodeX(String leftUpNo

103、deX) {</p><p>  LeftUpNodeX = leftUpNodeX;</p><p><b>  }</b></p><p>  public String getLeftUpNodeY() {</p><p>  return LeftUpNodeY;</p><p><

104、b>  }</b></p><p>  public void setLeftUpNodeY(String leftUpNodeY) {</p><p>  LeftUpNodeY = leftUpNodeY;</p><p><b>  }</b></p><p>  public String ge

105、tMaxX() {</p><p>  return MaxX;</p><p><b>  }</b></p><p>  public void setMaxX(String maxX) {</p><p>  MaxX = maxX;</p><p><b>  }</b&g

106、t;</p><p>  public String getMaxY() {</p><p>  return MaxY;</p><p><b>  }</b></p><p>  public void setMaxY(String maxY) {</p><p>  MaxY = maxY;

107、</p><p><b>  }</b></p><p>  public String getMinX() {</p><p>  return MinX;</p><p><b>  }</b></p><p>  public void setMinX(String m

108、inX) {</p><p>  MinX = minX;</p><p><b>  }</b></p><p>  public String getMinY() {</p><p>  return MinY;</p><p><b>  }</b></p>

109、<p>  public void setMinY(String minY) {</p><p>  MinY = minY;</p><p><b>  }</b></p><p>  將流程圖中節(jié)點的屬性對象進行采集以后,通過調用</p><p>  ObjectToXMLUtil.objectXmlE

110、ncoder方法可以對節(jié)點和弧段進行保存,以下代碼是對節(jié)點的保存,描述如下:</p><p>  Vector v = new Vector();</p><p>  Vector temp = this.canvas.getNodeObject();</p><p>  for(int i=0;i<temp.size();i++){//通過NODEBEAN存

111、儲</p><p>  Node o = (Node)temp.elementAt(i);</p><p>  NodeBean bean = new NodeBean();</p><p>  bean.setNodeName(o.NodeName);</p><p>  bean.setLeftUpNodeX(o.getLeftUpNod

112、eX()+"");</p><p>  bean.setLeftUpNodeY(o.getLeftUpNodeY()+"");</p><p>  bean.setMaxX(o.GetMaxX()+"");</p><p>  bean.setMaxY(o.GetMaxY()+"");&

113、lt;/p><p>  bean.setMinX(o.GetMinX()+"");</p><p>  bean.setMinY(o.GetMinY()+"");</p><p>  v.add(bean); </p><p><b>  }</b></p><p

114、>  String nodeFile = "nodeData"+System.currentTimeMillis()+".xml";</p><p>  ObjectToXMLUtil.objectXmlEncoder( v ,nodeFile );</p><p>  對弧線的屬性采集類ArcBean相關的代碼描述如下:</p>

115、<p>  public class ArcBean implements java.io.Serializable{}</p><p>  private String endx;</p><p>  private String endy;</p><p>  private String startx;</p><p>  

116、private String starty;</p><p>  public ArcBean(){//返回值</p><p><b>  } </b></p><p>  public String getEndx() {</p><p>  return endx;</p><p><b

117、>  }</b></p><p>  public void setEndx(String endx) {</p><p>  this.endx = endx;</p><p><b>  }</b></p><p>  public String getEndy() {</p><

118、;p>  return endy;</p><p><b>  }</b></p><p>  public void setEndy(String endy) {</p><p>  this.endy = endy;</p><p><b>  }</b></p><p

119、>  public String getStartx() {</p><p>  return startx;</p><p><b>  }</b></p><p>  public void setStartx(String startx) {</p><p>  this.startx = startx;&l

120、t;/p><p><b>  }</b></p><p>  public String getStarty() {</p><p>  return starty;</p><p><b>  }</b></p><p>  public void setStarty(Stri

121、ng starty) {</p><p>  this.starty = starty;</p><p><b>  }</b></p><p>  將流程圖中弧線的屬性對象進行采集以后,通過調用</p><p>  ObjectToXMLUtil.objectXmlEncoder方法可以對節(jié)點和弧段進行保存,以下代碼是

122、對節(jié)點的保存,描述如下:</p><p>  Vector line = new Vector();</p><p>  Vector lineTemp = this.canvas.getArcObject();</p><p>  for(int i=0;i<lineTemp.size();i++){</p><p>  Arc o

123、= (Arc)lineTemp.elementAt(i);</p><p>  ArcBean bean = new ArcBean();</p><p>  bean.setStartx(o.getStartx()+"");</p><p>  bean.setStarty(o.getStarty()+"");</p&

124、gt;<p>  bean.setEndx(o.getEndx()+"");</p><p>  bean.setEndy(o.getEndy()+"");</p><p>  line.add(bean); </p><p><b>  }</b></p><p>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論