看了net博客介绍的不少wf流程设计器实现,也来介绍下java版的jbpm流程设计器来给大家看看。jbpm它本身也有基于eclipse插件和web版的流程设计器,不过一般我们使用jbpm开发时,都有很多自定义的东西,使用它自带的,会有一些不方便性,所以开发自定义的流程设计器,会有很多方便性。目前见过的用来开发流程设计器的组件有vml、svg、gef、jgraph,最近在javaeye上牛人介绍的Twave组件应该也适合用来开发。本篇将会介绍用jgraph来开发一个简单的jbpm4的流程设计器。jgraph官网:www.jgraph.com,目前有java版、javascript版、flash版,java版的jgraph是开源免费的,详细的介绍可以看官网。本文使用的JGraph版本是jgraphx 1.4.0.9(也叫jgraph6),它与jgraph5有很大的不同,实现类基本不同了。
本篇先实现流程节点的插入,目前只实现开始节点的插入,后续的文章将会陆续介绍其它功能的完成。
GUI直接使用swing,目前只实现在鼠标单击时,插入一个节点,主要实现代码类:
GraphImpl.java代码
packagecom.workflow.designer.view;
importjava.awt.Point;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importcom.mxgraph.swing.mxGraphComponent;
importcom.mxgraph.view.mxGraph;
importcom.workflow.designer.model.Node;
importcom.workflow.designer.util.Logger;
publicabstractclassGraphImplextendsmxGraphComponentimplementsMouseListener{
//新建Jgraph面板,所有节点都绘制在该面板privatestaticmxGraph graph=newmxGraph();
publicGraphImpl(){
super(graph);
//给面板添加鼠标事件this.getGraphControl().addMouseListener(this);
}
publicabstractvoidinser(Point p, Node n);
publicabstractvoidmouseClicked(MouseEvent e);
publicabstractvoidmousePressed(MouseEvent e);
publicabstractvoidmouseReleased(MouseEvent e);
publicabstractvoidmouseEntered(MouseEvent e);
publicabstractvoidmouseExited(MouseEvent e);
publicmxGraph getGraph(){
returngraph;
}}
GraphView.java代码
packagecom.workflow.designer.view;
importjava.awt.Point;
importjava.awt.event.MouseEvent;
importcom.mxgraph.view.mxGraph;
importcom.workflow.designer.model.Node;
importcom.workflow.designer.util.Logger;
publicclassGraphViewextendsGraphImpl{
privatemxGraph graph=this.getGraph();
privateObject parent=graph.getDefaultParent();
publicGraphView(){
}
publicvoidinser(Point p, Node n){
this.getGraph().getModel().beginUpdate();
try
{
//调用jgraph插入节点Object v1=graph.insertVertex(parent,null, n.getLabel(), p.getX()-5, p.getY()-5, n.getWidth(),
n.getHeight(), n.getShape());
}finally
{
graph.getModel().endUpdate();
} }
publicvoidmouseClicked(MouseEvent e){
Point p=e.getPoint();
//鼠标点击时,在jgraph面板上插入节点inser(p,newNode("开始","start","shape=ellipse;perimeter=ellipsePerimeter;"));
Logger.debug("mouseClicked");
}
publicvoidmousePressed(MouseEvent e){
Logger.debug("mousePressed");
}
publicvoidmouseReleased(MouseEvent e){
Logger.debug("mouseReleased");
}
publicvoidmouseEntered(MouseEvent e){
Logger.debug("mouseEntered");
}
publicvoidmouseExited(MouseEvent e){
Logger.debug("mouseExited");
}
}
待续。。。。。。。。。。。。
详细代码可以自己看附件的代码。