Posted on 2010-08-25 15:24 
penngo 阅读(4272) 
评论(1)  编辑  收藏  所属分类: 
JBPM 
			 
			
		 
		jbpm流程设计器开发(1)
本篇主要实现了多个流程节点的绘制。
部分功能代码
FlowNode.xml主要配置流程节点的属性。
 <?xml version="1.0" encoding="GBK" standalone="yes"?>
<?xml version="1.0" encoding="GBK" standalone="yes"?>
 <flowNode>
<flowNode>
 <node height="40" width="40" type="straight" shape="shape=ellipse;perimeter=ellipsePerimeter;"
    <node height="40" width="40" type="straight" shape="shape=ellipse;perimeter=ellipsePerimeter;" 

 icon="images/straight.gif" label="直线"/>
icon="images/straight.gif" label="直线"/>
 <node height="40" width="40" type="start" shape="shape=ellipse;perimeter=ellipsePerimeter;" icon="images/start.gif"
    <node height="40" width="40" type="start" shape="shape=ellipse;perimeter=ellipsePerimeter;" icon="images/start.gif" 

 label="开始"/>
label="开始"/>
 <node height="40" width="40" type="end" shape="shape=doubleEllipse;perimeter=ellipsePerimeter;" icon="images/end.gif"
    <node height="40" width="40" type="end" shape="shape=doubleEllipse;perimeter=ellipsePerimeter;" icon="images/end.gif" 

 label="结束"/>
label="结束"/>
 <node height="40" width="80" type="state" shape="rounded=1;" icon="images/state.gif" label="状态"/>
    <node height="40" width="80" type="state" shape="rounded=1;" icon="images/state.gif" label="状态"/>
 <node height="40" width="80" type="task" shape="rounded=1;" icon="images/task.gif" label="任务"/>
    <node height="40" width="80" type="task" shape="rounded=1;" icon="images/task.gif" label="任务"/>
 <node height="40" width="40" type="decision" shape="shape=rhombus;perimeter=rhombusPerimeter;"
    <node height="40" width="40" type="decision" shape="shape=rhombus;perimeter=rhombusPerimeter;" 

 icon="images/decision.gif" label="判断"/>
icon="images/decision.gif" label="判断"/>
 <node height="40" width="40" type="fork" shape="shape=rhombus;perimeter=rhombusPerimeter;" icon="images/fork.gif"
    <node height="40" width="40" type="fork" shape="shape=rhombus;perimeter=rhombusPerimeter;" icon="images/fork.gif" 

 label="分支"/>
label="分支"/>
 <node height="40" width="40" type="join" shape="shape=rhombus;perimeter=rhombusPerimeter;" icon="images/join.gif"
    <node height="40" width="40" type="join" shape="shape=rhombus;perimeter=rhombusPerimeter;" icon="images/join.gif" 

 label="合并"/>
label="合并"/>
 </flowNode>
</flowNode>
LeftPanel.java主要显示流程节点列表
 package com.workflow.designer.view;
package com.workflow.designer.view;
 import java.awt.Color;
import java.awt.Color;
 import java.awt.Component;
import java.awt.Component;
 import java.awt.Desktop;
import java.awt.Desktop;
 import java.awt.event.MouseAdapter;
import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
import java.awt.event.MouseEvent;
 import java.io.File;
import java.io.File;

 import javax.swing.DefaultListModel;
import javax.swing.DefaultListModel;
 import javax.swing.Icon;
import javax.swing.Icon;
 import javax.swing.ImageIcon;
import javax.swing.ImageIcon;
 import javax.swing.JLabel;
import javax.swing.JLabel;
 import javax.swing.JList;
import javax.swing.JList;
 import javax.swing.JPanel;
import javax.swing.JPanel;
 import javax.swing.ListCellRenderer;
import javax.swing.ListCellRenderer;
 import javax.swing.filechooser.FileSystemView;
import javax.swing.filechooser.FileSystemView;
 import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBContext;
 import javax.xml.bind.Unmarshaller;
import javax.xml.bind.Unmarshaller;

 import com.mxgraph.view.mxGraph;
import com.mxgraph.view.mxGraph;
 import com.workflow.designer.model.FlowNode;
import com.workflow.designer.model.FlowNode;
 import com.workflow.designer.model.Node;
import com.workflow.designer.model.Node;
 import com.workflow.designer.util.Logger;
import com.workflow.designer.util.Logger;


 public class LeftPanel extends JList
public class LeftPanel extends JList {
{
 //private JList list = null;
    //private JList list = null;
 private GraphImpl graph = null;
    private GraphImpl graph = null;
 private DefaultListModel listModel = null;
    private DefaultListModel listModel = null;

 public LeftPanel()
    public LeftPanel() {
{
 init();
        init();
 }
    }
 
    

 public DefaultListModel getListModel()
    public DefaultListModel getListModel()  {
{
 return listModel;
        return listModel;
 }
    }


 public void setListModel(DefaultListModel listModel)
    public void setListModel(DefaultListModel listModel)  {
{
 this.listModel = listModel;
        this.listModel = listModel;
 }
    }


 private void init()
    private void init()  {
{
 listModel = new DefaultListModel();
        listModel = new DefaultListModel();
 
        

 try
        try {
{
 //JList数据初始化
            //JList数据初始化
 JAXBContext jc = JAXBContext.newInstance("com.workflow.designer.model");
        JAXBContext jc = JAXBContext.newInstance("com.workflow.designer.model");
 Unmarshaller u = jc.createUnmarshaller();
        Unmarshaller u = jc.createUnmarshaller();
 FlowNode fn = (FlowNode) u
        FlowNode fn = (FlowNode) u
 .unmarshal(FlowNode.class.getClassLoader().getResourceAsStream("com/workflow/designer/model/FlowNode.xml"));
        .unmarshal(FlowNode.class.getClassLoader().getResourceAsStream("com/workflow/designer/model/FlowNode.xml"));

 for(Node n:fn.getNode())
        for(Node n:fn.getNode()) {
{
 listModel.addElement(n);
            listModel.addElement(n);
 }
        }
 }
        }

 catch(Exception e)
        catch(Exception e) {
{
 e.printStackTrace();
            e.printStackTrace();
 }
        }
 this.setModel(listModel);
        this.setModel(listModel);
 this.setCellRenderer(new MyCellRenderer());
        this.setCellRenderer(new MyCellRenderer());

 this.addMouseListener(new MouseAdapter()
        this.addMouseListener(new MouseAdapter()  {
{

 public void mouseClicked(MouseEvent e)
            public void mouseClicked(MouseEvent e)  {
{
 super.mouseClicked(e);
                super.mouseClicked(e);
 }
            }
 
        

 public void mousePressed(MouseEvent e)
            public void mousePressed(MouseEvent e)  {
{

 super.mousePressed(e);
                super.mousePressed(e);
 }
            }
 });
        });
 
    
 }
    }
 
    

 class MyCellRenderer extends JLabel implements ListCellRenderer
    class MyCellRenderer extends JLabel implements ListCellRenderer  {
{
 public Component getListCellRendererComponent(JList list,
        public Component getListCellRendererComponent(JList list, 
 Object value,
                Object value, 
 int index,
                int index, 
 boolean isSelected,
                boolean isSelected, 
 boolean cellHasFocus)
                boolean cellHasFocus) 

 
         {
{

 if (value instanceof Node)
            if (value instanceof Node)  {
{
 Node n = (Node) value;
                Node n = (Node) value;
 Icon icon = new ImageIcon(getClass().getClassLoader().getResource(n.getIcon()));
                Icon icon = new ImageIcon(getClass().getClassLoader().getResource(n.getIcon()));
 setIcon(icon);
                setIcon(icon);
 }
            }
 String s = value.toString();
            String s = value.toString();
 setText(s);
            setText(s);
 this.setToolTipText(s);
            this.setToolTipText(s);
 
            

 if (isSelected)
            if (isSelected)  {
{
 setBackground(list.getSelectionBackground());
                setBackground(list.getSelectionBackground());
 setForeground(list.getSelectionForeground());
                setForeground(list.getSelectionForeground());

 } else
            } else  {
{
 setBackground(Color.WHITE);
                setBackground(Color.WHITE);
 setForeground(list.getForeground());
                setForeground(list.getForeground());
 }
            }
 
            
 setEnabled(list.isEnabled());
            setEnabled(list.isEnabled());
 setOpaque(true);
            setOpaque(true);
 return this;
            return this;
 }
        }
 }
    }
 
    

 public void setGraph(GraphImpl gi)
    public void setGraph(GraphImpl gi)  {
{
 this.graph = gi;
        this.graph = gi;
 }
    }
 
    

 public static void main(String arg[])
    public static void main(String arg[])  {
{
 new LeftPanel();
        new LeftPanel();
 }
    }
 }
}
GraphView.java获取LeftPanel中被选中的节点,并在面板上绘制该节点
 package com.workflow.designer.view;
package com.workflow.designer.view;

 import java.awt.Point;
import java.awt.Point;
 import java.awt.event.MouseEvent;
import java.awt.event.MouseEvent;

 import com.mxgraph.model.mxCell;
import com.mxgraph.model.mxCell;
 import com.mxgraph.view.mxGraph;
import com.mxgraph.view.mxGraph;
 import com.workflow.designer.model.Node;
import com.workflow.designer.model.Node;
 import com.workflow.designer.util.Logger;
import com.workflow.designer.util.Logger;


 public class GraphView extends GraphImpl
public class GraphView extends GraphImpl {
{
 private mxGraph graph = this.getGraph();
    private mxGraph graph = this.getGraph();
 private Object parent = graph.getDefaultParent();
    private Object parent = graph.getDefaultParent();
 private LeftPanel lp = null;
    private LeftPanel lp = null;

 public GraphView(LeftPanel lp)
     public GraphView(LeftPanel lp) {
{
 this.lp = lp;
         this.lp = lp;
 }
     }


 public void inser(Point p, Node n)
     public void inser(Point p, Node n) {
{
 this.getGraph().getModel().beginUpdate();
         this.getGraph().getModel().beginUpdate();
 try
            try

 
             {
{
 //调用jgraph插入节点
                //调用jgraph插入节点
 Object v1 = graph.insertVertex(parent, null, n.getLabel(), p.getX() - 5, p.getY() - 5,
               Object v1 = graph.insertVertex(parent, null, n.getLabel(), p.getX() - 5, p.getY() - 5, 

 n.getWidth(),
n.getWidth(),
 n.getHeight(), n.getShape());
                     n.getHeight(), n.getShape());
 ((mxCell)v1).setConnectable(false);
               ((mxCell)v1).setConnectable(false);
 }
            }
 finally
            finally

 
             {
{
 graph.getModel().endUpdate();
               graph.getModel().endUpdate();
 }
            }
 }
     }
 
     

 public void mouseClicked(MouseEvent e)
     public void mouseClicked(MouseEvent e) {
{
 //获取被选中节点
        //获取被选中节点
 Object obj = lp.getSelectedValue();
         Object obj = lp.getSelectedValue();

 if(obj instanceof Node)
         if(obj instanceof Node) {
{
 Node n = (Node)obj;
             Node n = (Node)obj;
 Point p = e.getPoint();
             Point p = e.getPoint();

 if(!n.getType().equals("straight"))
             if(!n.getType().equals("straight")) {
{
 //鼠标点击时,在jgraph面板上插入节点
                //鼠标点击时,在jgraph面板上插入节点
 inser(p, n);
                 inser(p, n);
 lp.clearSelection();
                 lp.clearSelection();
 }
             }
 }
         }
 }
     }


 public void mousePressed(MouseEvent e)
    public void mousePressed(MouseEvent e) {
{
 
        
 }
    }


 public void mouseReleased(MouseEvent e)
    public void mouseReleased(MouseEvent e) {
{
 
        
 }
    }


 public void mouseEntered(MouseEvent e)
    public void mouseEntered(MouseEvent e) {
{
 //只有在线条节点被选中时,才能绘制连接线
        //只有在线条节点被选中时,才能绘制连接线
 Object obj = lp.getSelectedValue();
        Object obj = lp.getSelectedValue();

 if(obj instanceof Node)
         if(obj instanceof Node) {
{
 Node n = (Node)obj;
             Node n = (Node)obj;
 Object parent = graph.getDefaultParent();
             Object parent = graph.getDefaultParent();
 Object childs[] = graph.getChildCells(parent);
             Object childs[] = graph.getChildCells(parent);

 if(n.getType().equals("straight"))
             if(n.getType().equals("straight")) {
{

 for(Object cell:childs)
                for(Object cell:childs) {
{
 ((mxCell)cell).setConnectable(true); //设置可连线
                    ((mxCell)cell).setConnectable(true); //设置可连线
 }
                }
 }
             }

 else
             else {
{

 for(Object cell:childs)
                 for(Object cell:childs) {
{
 ((mxCell)cell).setConnectable(false);
                    ((mxCell)cell).setConnectable(false);
 }
                }
 }
             }
 }
        }
 }
    }


 public void mouseExited(MouseEvent e)
    public void mouseExited(MouseEvent e) {
{
 }
    }
 }
}

绘制的流程图
 
现在已经基本实现流程的绘制了,下一篇将会介绍流程定义文件保存打开。
源码:
源码
打包jar:
jgraphxflow.jar