如鵬網 大學生計算機學習社區

          CowNew開源團隊

          http://www.cownew.com 郵件請聯系 about521 at 163.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            363 隨筆 :: 2 文章 :: 808 評論 :: 0 Trackbacks
           

          已經可以比較好的運行JBPM了,但是如果能以圖形化的方式顯示工作流,并且把當前節點高亮顯示,這樣可用性就更好了,用戶可以很輕松的看到當前流程到哪個節點了。

                 我發現JBPMstarters-kit的例子中就有類似的效果,所以決定分析一下它是怎么實現的。

                 打開網頁,瀏覽到有顯示當前工作流節點的頁面,查看到此頁面的地址為task.jsp,發現其中的核心代碼如下:

          <jbpm:processimage task="${taskBean.taskInstanceId}"/>

                 這里使用了JBPM提供的jbpm:processimage標簽,此標簽定義在jbpm.tld中,這個Tag的類為org.jbpm.webapp.tag.ProcessImageTag。所以只要使用這個標簽我們就可以很輕松的在Web頁面中顯示圖形化的工作流了。

                 那么如果是在SwingSWT等非Web界面中也想顯示這種效果怎么辦呢?那么讓我們來分析一下ProcessImageTag類。

           private void retrieveByteArrays() {

              try {

                FileDefinition fileDefinition = processDefinition.getFileDefinition();

                gpdBytes = fileDefinition.getBytes("gpd.xml");

                imageBytes = fileDefinition.getBytes("processimage.jpg");

              } catch (Exception e) {

                e.printStackTrace();

              }

           }

                 gpd.xml中記錄的是節點的位置關系,processimage.jpg是圖形化的圖片(只是基圖,沒有高亮顯示當前節點),這兩個文件是JBPMEclipse插件自動生成的。

                 得到流程實例當前節點的方法:

           private void initialize() {

              JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext();

              if (this.taskInstanceId > 0) {

                     TaskInstance taskInstance = jbpmContext.getTaskMgmtSession().loadTaskInstance(taskInstanceId);

                     currentToken = taskInstance.getToken();

              }

              else

              {

                     if (this.tokenInstanceId > 0)

                            currentToken = jbpmContext.getGraphSession().loadToken(this.tokenInstanceId);

              }

              processDefinition = currentToken.getProcessInstance().getProcessDefinition();

           }

                 currentToken中可以得到當前節點在顯示的時候的長度、寬度、橫縱坐標等值。得到的方式如下:

           private int[] extractBoxConstraint(Element root) {

              int[] result = new int[4];

              String nodeName = currentToken.getNode().getName();

              XPath xPath = new DefaultXPath("http://node[@name='" + nodeName + "']");

              Element node = (Element) xPath.selectSingleNode(root);

              result[0] = Integer.valueOf(node.attribute("x").getValue()).intValue();

              result[1] = Integer.valueOf(node.attribute("y").getValue()).intValue();

              result[2] = Integer.valueOf(node.attribute("width").getValue()).intValue();

              result[3] = Integer.valueOf(node.attribute("height").getValue()).intValue();

              return result;

           }

                 這樣用<div/>標簽就可以將當前節點框上一個紅色的框框了:

                     jspOut.println("<div style='position:relative; background-image:url(" + imageLink + "); width: " + imageDimension[0] + "px; height: " + imageDimension[1] + "px;'>");

                 //詳細代碼參考:writeTable方法

          原來高亮顯示是在原有的圖片上疊加一個高亮的框框實現的。所以如果要顯示在SwingSWT中的話也只要參考這個思路,在當前節點位置顯示一個高亮的框框就可以了!

          posted on 2007-11-19 17:44 CowNew開源團隊 閱讀(6055) 評論(8)  編輯  收藏

          評論

          # re: 以圖形化的方式顯示JBPM當前流程的方法及原理分析 2007-11-20 09:30 專注JAVA開源
          以前做過一個基于xpdl的流程監控的程序  回復  更多評論
            

          # re: 以圖形化的方式顯示JBPM當前流程的方法及原理分析[未登錄] 2008-11-13 10:04 Simple
          JBPM可以與Ibatis結合嗎?  回復  更多評論
            

          # re: 以圖形化的方式顯示JBPM當前流程的方法及原理分析 2008-11-15 13:32 漠漠
          @Simple
          可以,使用同一個數據源!  回復  更多評論
            

          # re: 以圖形化的方式顯示JBPM當前流程的方法及原理分析[未登錄] 2008-11-24 16:19 Simple
          可不可以發個Demo我參考一下~~   回復  更多評論
            

          # re: 以圖形化的方式顯示JBPM當前流程的方法及原理分析 2009-06-01 09:46 不毛之地
          太強了,正是我想要的  回復  更多評論
            

          # re: 以圖形化的方式顯示JBPM當前流程的方法及原理分析 2009-06-26 10:49 魚中魚
          但是在private void retrieveByteArrays() {
          try {
          FileDefinition fileDefinition = processDefinition.getFileDefinition();
          gpdBytes = fileDefinition.getBytes("gpd.xml");
          //gpdBytes = fileDefinition.getBytes("com/flowdemo/jbpm/expense/gpd.xml");
          imageBytes = fileDefinition.getBytes("processimage.jpg");
          //imageBytes = fileDefinition.getBytes("com/flowdemo/jbpm/expense/processimage.jpg");
          } catch (Exception e) {
          e.printStackTrace();
          }
          }
          gpdBytes = fileDefinition.getBytes("gpd.xml");這一句的時候發生異常了,出現空指針是怎么回事呢?請賜教,謝謝。
            回復  更多評論
            

          # re: 以圖形化的方式顯示JBPM當前流程的方法及原理分析 2009-08-29 08:22 zw
          @魚中魚

          zw7534313@163.com 咋解決的?
            回復  更多評論
            

          # re: 以圖形化的方式顯示JBPM當前流程的方法及原理分析 2010-05-29 12:21 小鄧子
          在private void retrieveByteArrays() {
          try {
          FileDefinition fileDefinition = processDefinition.getFileDefinition();
          gpdBytes = fileDefinition.getBytes("gpd.xml");
          //gpdBytes = fileDefinition.getBytes("com/flowdemo/jbpm/expense/gpd.xml");
          imageBytes = fileDefinition.getBytes("processimage.jpg");
          //imageBytes = fileDefinition.getBytes("com/flowdemo/jbpm/expense/processimage.jpg");
          } catch (Exception e) {
          e.printStackTrace();
          }
          }
          gpdBytes = fileDefinition.getBytes("gpd.xml");這一句的時候發生異常了,出現空指針是怎么回事呢?請賜教,謝謝。
          郵箱:djx@kingtopinfo.com 希望得到回復!  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 宝丰县| 正镶白旗| 勃利县| 寻乌县| 鄂尔多斯市| 邹平县| 山阳县| 芷江| 临沭县| 资中县| 临高县| 永城市| 禹城市| 茶陵县| 宁都县| 佛教| 独山县| 西峡县| 城市| 阳新县| 洛浦县| 高州市| 唐山市| 雷山县| 汝阳县| 湟源县| 双桥区| 磐石市| 宜黄县| 上犹县| 綦江县| 城固县| 格尔木市| 葫芦岛市| 遂溪县| 西华县| 冷水江市| 普安县| 万盛区| 赣州市| 沂源县|