用java画工作流流程图,java生成流程图

来源:互联网 发布:服务器raid数据恢复 编辑:程序博客网 时间:2024/05/17 05:13
/* * Copyright 2015 iminasha.com All right reserved. This software is the confidential and proprietary information of * iminasha.com ("Confidential Information"). You shall not disclose such Confidential Information and shall use it only * in accordance with the terms of the license agreement you entered into with iminasha.com. */package com.imiansha.wms.controller.workflow;import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.Image;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.util.List;import javax.imageio.ImageIO;import javax.servlet.ServletOutputStream;import com.jfinal.kit.PathKit;import com.jfinal.render.Render;/** * 类DrawFlowChart.java的实现描述:根据审批人画流程图 *  * @author leon 2015年7月14日 上午9:37:56 */public class DrawFlowChart extends Render {    private int                width;    private final int          intervalOfX = 100;// 每个元素之间的x轴间距    private List<List<String>> approvalers;//审批人组集合    /**     * @param width     * @param approvalers     */    public DrawFlowChart(int width, List<List<String>> approvalers){        super();        this.width = width;        this.approvalers = approvalers;    }    /**     * @return the width     */    public int getWidth() {        return width;    }    /**     * @param width the width to set     */    public void setWidth(int width) {        this.width = width;    }    /**     * @return the approvalers     */    public List<List<String>> getApprovalers() {        return approvalers;    }    /**     * @param approvalers the approvalers to set     */    public void setApprovalers(List<List<String>> approvalers) {        this.approvalers = approvalers;    }    @Override    public void render() {        BufferedImage image = drawFlowChartImg();        response.setHeader("Pragma", "no-cache");        response.setHeader("Cache-Control", "no-cache");        response.setDateHeader("Expires", 0);        response.setContentType("image/jpeg");        ServletOutputStream sos = null;        try {            sos = response.getOutputStream();            ImageIO.write(image, "jpeg", sos);        } catch (Exception e) {            throw new RuntimeException(e);        } finally {            if (sos != null) try {                sos.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }    /**     * 画流程图     *      * @return     */    private BufferedImage drawFlowChartImg() {        // 获取箭头图标文件        File srcFile = new File(PathKit.getRootClassPath() + File.separator + "arrow.png");        Image srcImg = null;        try {            srcImg = ImageIO.read(srcFile);        } catch (IOException e) {            e.printStackTrace();        }        // 计算画布的高度        // 画布高度=每组审批人的总高度+箭头高度        // 获取最多审批人的组        // 每组中的每个审批人y坐标间隔20        int every_approvaler_distance = 20;        int maxApprovalCount = this.getMaxListSize(approvalers);        // 计算画布的最高高度        int height = maxApprovalCount * every_approvaler_distance + srcImg.getHeight(null);        // 绘制宽=width,长=hight的图板        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);        // 获取图形上下文,graphics想象成一个画笔        Graphics2D graphics = (Graphics2D) image.getGraphics();        // 对指定的矩形区域填充颜色        graphics.setColor(Color.WHITE); // GREEN:绿色; 红色:RED; 灰色:GRAY        graphics.fillRect(0, 0, width, height);        // 箭头数量        int arrowCount = 1;        // 设置文字颜色        graphics.setColor(Color.BLACK);        graphics.setFont(new Font("宋体", Font.BOLD, 14));        int lastGroupElementX = 0;// 最后一组元素的X坐标        int arrowY = height / 2 - srcImg.getHeight(null);// 箭头的y坐标        if (approvalers != null && approvalers.size() > 0) {            for (List<String> approvalerList : approvalers) {                int i = 1;                int maxWidthOfGroup = 0;// 每组最大宽度                int compareTmp = 0;// 比较宽度的变量                lastGroupElementX += intervalOfX;// 最后一组的x坐标                int approvalerListSize = approvalerList.size();// 每组审批人数量                // 计算每个组的第一个元素的y坐标                int everyGruopFirstElementY = 0;                if (approvalerListSize % 2 == 0) {                    everyGruopFirstElementY = maxApprovalCount * every_approvaler_distance / 2                                              - every_approvaler_distance                                              - (approvalerListSize / 2 - 1) * every_approvaler_distance;                } else {                    everyGruopFirstElementY = maxApprovalCount * every_approvaler_distance / 2                                              - (approvalerListSize / 2 + 1) * every_approvaler_distance;                }                // 将审批人画在图片上                for (String elementStr : approvalerList) {                    int strWidth = graphics.getFontMetrics().stringWidth(elementStr);                    if (approvalerListSize < maxApprovalCount) {                        graphics.drawString(elementStr, lastGroupElementX,                                            everyGruopFirstElementY + i * every_approvaler_distance);                    } else {                        graphics.drawString(elementStr, lastGroupElementX, i * every_approvaler_distance);                    }                    // 计算最大的审批人字符串宽度                    maxWidthOfGroup = strWidth;                    if (maxWidthOfGroup < compareTmp) {                        maxWidthOfGroup = compareTmp;                    } else {                        compareTmp = strWidth;                    }                    i++;                }                lastGroupElementX += maxWidthOfGroup;// 重新计算最后一个元素的y坐标                // 将箭头画在图片上                if (arrowCount < approvalers.size()) {                    graphics.drawImage(srcImg, lastGroupElementX + srcImg.getWidth(null), arrowY, null);                    lastGroupElementX += srcImg.getWidth(null);                }                arrowCount++;            }        }        graphics.dispose();// 释放此图形的上下文并释放它所使用的所有系统资源        return image;    }    /**     * 获取list集合中最大的list size     *      * @param list     * @return     */    private int getMaxListSize(List<List<String>> list) {        if (list == null || list.size() == 0) {            return 0;        }        int maxSize = list.get(0).size();        int compareTmp = maxSize;        for (List<String> listTmp : list) {            maxSize = listTmp.size();            if (maxSize < compareTmp) {                maxSize = compareTmp;            } else {                compareTmp = listTmp.size();            }        }        return maxSize;    }}

0 0
原创粉丝点击