阿里云低价服务器1折特惠,优惠爽翻天,点我立即低价购买

/** 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;}@Overridepublic 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坐标间隔20int 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; 灰色:GRAYgraphics.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;}}

用java画工作流流程图,java生成流程图相关推荐

  1. java画_用Java画光

    这位大佬最近在知乎专栏发布了一个系列教程:<用C语言画光>,在2D空间中阐释了光线追踪算法的原理. 我一口气读完了七篇文章,感觉收获很大.跟着他的脚步用C语言实现了这些算法后,意犹未尽,又 ...

  2. 源码自动生成流程图软件介绍

    最近学校要交课程设计作业,不仅要代码和运行截图,还需要流程图.写代码已经很不容易了,画流程图看着就头大,想偷个懒,但是也没有办法.偶然发现了几款可以根据代码自动生成流程图的软件,分享以下,希望大家都能 ...

  3. Java 程序员必备的一些流程图

    1.spring的生命周期 2.TCP三次握手,四次挥手 3.线程池执行流程图 4.JVM内存结构 5.Java内存模型 6.springMVC执行流程图 7.JDBC执行流程 8.spring cl ...

  4. 多图 | Java 程序员必备的一些流程图

    1.spring的生命周期 2.TCP三次握手,四次挥手 3.线程池执行流程图 4.JVM内存结构 5.Java内存模型 6.springMVC执行流程图 7.JDBC执行流程 8.spring cl ...

  5. java题目 万年历 计划书,Java版万年历设计报告及流程图

    <Java版万年历设计报告及流程图>由会员分享,可在线阅读,更多相关<Java版万年历设计报告及流程图(7页珍藏版)>请在人人文库网上搜索. 1.Java课程设计题目 万年历 ...

  6. Visustin(自动生成流程图)使用说明

    在网上找了很多源码自动生成流程图的软件,结果,只有这款软件可以支持c++,而且能白嫖. 链接:Aivosto downloads - Analyze, document and flowchart y ...

  7. java开源工作流引擎优势是什么?

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.流程引擎的自我介绍 二.java开源工作流引擎优势介绍 总结 前言 IBPSv3.5是流辰信息团队面向Java开发 ...

  8. java jbpm工作流,三分钟明白 Activity工作流,工作流jbpm

    三分钟明白 Activity工作流,工作流jbpm 一. 什么是工作流 Georgakopoulos给出的工作流定义是:工作流是将一组任务组织起来以完成某个经营过程:定义了任务的触发顺序和触发条件,每 ...

  9. Java开源工作流对比

    Java开源工作流对比 工作流(Workflow) 1.业务过程的部分或整体在计算机应用环境下的自动化: 2.是对工作流程及其各步骤之间业务规则的抽象.概括描述: 3.工作流主要解决的问题是:为了实现 ...

  10. 源代码生成流程图软件

    2019独角兽企业重金招聘Python工程师标准>>> 源码与流程图转换 1 流程图生成源代码软件 2 源代码生成流程图软件 2.1 Crystal FLOW 一款回顾和可视的从源代 ...

最新文章

  1. Android 表格HorizontalScrollView+ListView
  2. 【强化学习】Sarsa 和 Sarsa(λ)
  3. 窄行打印纸打印机规格_电脑打印纸的尺寸和打印机纸张规格的设置
  4. LeetCode Algorithm 268. 丢失的数字
  5. mysql导入csvnull,MySQL Workbench从CSV导入NULL
  6. node.js安装express(零起点搭建本地测试服务器)- 教程篇
  7. 宁静——一种心灵的奢望
  8. php 获取视频首帧,从视频中提取特定帧的最快方法(PHP/ffmpeg/anything)
  9. 计算机的五大组成部分(计组学习一)
  10. 跳台阶问题详解---动态规划
  11. 用DISM修复Win10系统文件教程
  12. php mysql完全自学手册 smarty_PHPSmarty完全开发手册.pdf
  13. 关于使用tess4j-OCR识别图片中文教程,亲测可用,不报错
  14. 电子电路基础 (4)——电阻的认识
  15. 使用面包板的一点小注意
  16. 互联网的发展对国民经济的促进发展
  17. JavaWeb网上书城项目
  18. 各类图片素材网址汇总,让网站的banner有灵魂!!
  19. opencv(c++)几何变换------图像平移、旋转、缩放、翻转、剪贴
  20. mysql qc_qc-mysql

热门文章

  1. ibm服务器机 安装系统安装系统安装方法,IBM服务器系统安装图解全攻略
  2. 串口调试助手fx2n_串口调试助手发送控制台达PLC命令
  3. 在线工具大全 - 推荐
  4. 音乐推荐系统(协同过滤和SVD)
  5. 【推荐系统】音乐推荐系统02
  6. 《CCNA学习指南:Cisco网络设备互连(ICND1)(第4版)》——导读
  7. java 有序set_java set 顺序
  8. 安装vs遇到 不受信任的证书或者 时间戳签名和/或证书无法验证或已损坏 解决方案
  9. 暴风影音2007全功能完美版和Symantec Norton的冲突
  10. 腾讯专访 | 子芽:代码疫苗技术,赋能数字化应用内生安全自免疫