`
iehyou
  • 浏览: 135464 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JFreeChart封装工具类

    博客分类:
  • J2EE
阅读更多
package com.wasu.itv.common.util;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.codehaus.xfire.addressing.RandomGUID;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.labels.StandardPieToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.util.Rotation;

public class JFreeChartUtils {

	/**
	 * step2:创建PieChart图表
	 * 
	 * @param dataset
	 * @return
	 */
	private static JFreeChart createPieChart(DefaultPieDataset dataset,
			String title,boolean is3D) {
		JFreeChart chart=null;
		if(is3D){
			chart=ChartFactory.createPieChart3D(
					title, // 图表标题
					dataset, // 数据集
					true, // 是否显示图例
					true, // 是否显示工具提示
					true // 是否生成URL
					);
		}
		else{ chart = ChartFactory.createPieChart(
				title, // 图表标题
				dataset, // 数据集
				true, // 是否显示图例
				true, // 是否显示工具提示
				true // 是否生成URL
				);
		}
		// 设置标题字体==为了防止中文乱码:必须设置字体
		chart.setTitle(new TextTitle(title, new Font("黑体", Font.ITALIC, 22)));
		// 设置图例的字体==为了防止中文乱码:必须设置字体
		chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 12));
		// 获取饼图的Plot对象(实际图表)
		PiePlot plot = (PiePlot) chart.getPlot();
		// 图形边框颜色
		plot.setBaseSectionOutlinePaint(Color.GRAY);
		// 图形边框粗细
		plot.setBaseSectionOutlineStroke(new BasicStroke(0.0f));
		// 设置饼状图的绘制方向,可以按顺时针方向绘制,也可以按逆时针方向绘制
		plot.setDirection(Rotation.ANTICLOCKWISE);
		// 设置绘制角度(图形旋转角度)
		plot.setStartAngle(70);
		// 设置突出显示的数据块
		// plot.setExplodePercent("One", 0.1D);
		// 设置背景色透明度
		plot.setBackgroundAlpha(0.7F);
		// 设置前景色透明度
		plot.setForegroundAlpha(0.65F);
		// 设置区块标签的字体==为了防止中文乱码:必须设置字体
		plot.setLabelFont(new Font("宋体", Font.PLAIN, 12));
		// 扇区分离显示,对3D图不起效
		if(is3D)
			plot.setExplodePercent(dataset.getKey(3), 0.1D);
		// 图例显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位
		plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
				"{0}:{1}\r\n({2})", NumberFormat.getNumberInstance(),
				new DecimalFormat("0.00%")));
		// 图例显示百分比
		// plot.setLegendLabelGenerator(new
		// StandardPieSectionLabelGenerator("{0}={1}({2})"));
		// 指定显示的饼图为:圆形(true) 还是椭圆形(false)
		plot.setCircular(true);
		// 没有数据的时候显示的内容
		plot.setNoDataMessage("找不到可用数据...");

		// 设置鼠标悬停提示
		plot.setToolTipGenerator(new StandardPieToolTipGenerator());
		// 设置热点链接
		// plot.setURLGenerator(new StandardPieURLGenerator("detail.jsp"));

		return chart;
	}

	private static JFreeChart createBarChart(CategoryDataset dataset,
			String title, String x, String y,boolean is3D) {
		JFreeChart chart =null;
		if(is3D){
			chart = ChartFactory.createBarChart3D( // 3D柱状图
					// JFreeChart chart = ChartFactory.createLineChart3D( //3D折线图
					title, // 图表的标题
					x, // 目录轴的显示标签
					y, // 数值轴的显示标签
					dataset, // 数据集
					PlotOrientation.VERTICAL, // 图表方式:V垂直;H水平
					true, // 是否显示图例
					false, // 是否显示工具提示
					false // 是否生成URL
					);
		}else{
			chart = ChartFactory.createBarChart( // 柱状图
					// JFreeChart chart = ChartFactory.createLineChart3D( //3D折线图
					title, // 图表的标题
					x, // 目录轴的显示标签
					y, // 数值轴的显示标签
					dataset, // 数据集
					PlotOrientation.VERTICAL, // 图表方式:V垂直;H水平
					true, // 是否显示图例
					false, // 是否显示工具提示
					false // 是否生成URL
					);
		}
		

		// ===============为了防止中文乱码:必须设置字体
		chart.setTitle(new TextTitle(title, new Font("黑体", Font.ITALIC, 22)));

		LegendTitle legend = chart.getLegend(); // 获取图例
		legend.setItemFont(new Font("宋体", Font.BOLD, 12)); // 设置图例的字体,防止中文乱码

		CategoryPlot plot = (CategoryPlot) chart.getPlot(); // 获取柱图的Plot对象(实际图表)
		// 设置柱图背景色(注意,系统取色的时候要使用16位的模式来查看颜色编码,这样比较准确)
		plot.setBackgroundPaint(new Color(255, 255, 204));
		plot.setForegroundAlpha(0.65F); // 设置前景色透明度

		// 设置横虚线可见
		plot.setRangeGridlinesVisible(true);
		// 虚线色彩
		plot.setRangeGridlinePaint(Color.gray);

		CategoryAxis h = plot.getDomainAxis(); // 获取x轴
		h.setMaximumCategoryLabelWidthRatio(1.0f);// 横轴上的 Lable 是否完整显示
		h.setLabelFont(new Font("宋体", Font.BOLD, 12));// 设置字体,防止中文乱码
		h.setTickLabelFont(new Font("宋体", Font.BOLD, 12));// 轴数值
		// h.setCategoryLabelPositions(CategoryLabelPositions.UP_45);//45度倾斜

		plot.getRangeAxis().setLabelFont(new Font("宋体", Font.BOLD, 12)); // Y轴设置字体,防止中文乱码

		// 柱图的呈现器
		BarRenderer renderer = new BarRenderer();
		// 设置柱子宽度
		// renderer.setMaximumBarWidth(0.05);
		// 设置柱子高度
		// renderer.setMinimumBarLength(0.2);
		// 设置柱子边框颜色
		renderer.setBaseOutlinePaint(Color.BLACK);
		// 设置柱子边框可见
		renderer.setDrawBarOutline(true);
		// 设置每个柱的颜色
		renderer.setSeriesPaint(0, Color.BLUE);
		renderer.setSeriesPaint(1, Color.GREEN);
		renderer.setSeriesPaint(2, Color.RED);
		// 设置每个地区所包含的平行柱的之间距离
		renderer.setItemMargin(0.05);
		// 显示每个柱的数值,并修改该数值的字体属性
		renderer.setIncludeBaseInRange(true);
		renderer
				.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		renderer.setBaseItemLabelsVisible(true);
		// 设置柱的透明度
		plot.setForegroundAlpha(1.0f);
		// 给柱图添加呈现器
		plot.setRenderer(renderer);

		// 没有数据的时候显示的内容
		plot.setNoDataMessage("找不到可用数据...");

		return chart;
	}

	/**
	 * 
	 * @param data
	 * @param title
	 * @param x
	 * @param y
	 * @param width
	 * @param heigth
	 * @param request
	 * @return
	 */
	public static String generateBarChart(List<Object[]> data, String title,
			String x, String y, int width, int heigth,boolean is3D,
			HttpServletRequest request) {
		boolean returnValue = false;
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		for (Iterator<Object[]> iterator = data.iterator(); iterator.hasNext();) {
			Object[] o = (Object[]) iterator.next();
			dataset.setValue(((Long) o[1]).intValue(), o[0] + ":" + o[1],
					o[2].toString());
		}
		JFreeChart chart = createBarChart(dataset, title, x, y,is3D);
		
		RandomGUID guid = new RandomGUID();
		SimpleDateFormat df = new SimpleDateFormat("/yyyy/MM/dd/");
		String subPath = df.format(new Timestamp(System.currentTimeMillis())) +guid.valueAfterMD5 + ".jpg";
		String returnPath="/images/itv/chart/"+subPath;
		
		File f=new File(request.getSession().getServletContext().getRealPath("/")+ returnPath);
		f.getParentFile().mkdirs();
		returnValue = drawToOutputStream(f.getAbsolutePath(), chart, width, heigth);
		return returnPath;
	}
	
	public static String generatePieChart(List<Object[]> data, String title,
			int width, int heigth, HttpServletRequest request,boolean is3D) {
		boolean returnValue = false;
		DefaultPieDataset dataset = new DefaultPieDataset();
		for (Iterator<Object[]> iterator = data.iterator(); iterator.hasNext();) {
			Object[] o = (Object[]) iterator.next();
			dataset.setValue(o[0].toString(), ((Long) o[1]).doubleValue());
		}
		JFreeChart chart = createPieChart(dataset, title,is3D);
		RandomGUID guid = new RandomGUID();
		SimpleDateFormat df = new SimpleDateFormat("/yyyy/MM/dd/");
		String subPath = df.format(new Timestamp(System.currentTimeMillis())) +guid.valueAfterMD5 + ".jpg";
		String returnPath="/images/itv/chart/"+subPath;
		
		File f=new File(request.getSession().getServletContext().getRealPath("/")+ returnPath);
		f.getParentFile().mkdirs();
		returnValue = drawToOutputStream(f.getAbsolutePath(), chart, width, heigth);
		return returnPath;
	}
	
	/**
	 * step3: 输出图表到指定的磁盘
	 * 
	 * @param destPath
	 * @param chart
	 */
	private static boolean drawToOutputStream(String destPath,
			JFreeChart chart, int width, int heigth) {
		FileOutputStream fos = null;
		boolean returnValue = true;
		try {
			fos = new FileOutputStream(destPath);
			ChartUtilities.writeChartAsPNG(fos, // 指定目标输出流
					chart, // 图表对象
					width, // 宽
					heigth, // 高
					null); // ChartRenderingInfo信息
		} catch (IOException e) {
			e.printStackTrace();
			returnValue = false;
		} finally {
			try {
				fos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}

		}
		return returnValue;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		CategoryDataset  dataset = createBarDataSet2();
		JFreeChart chart=createBarChart(dataset, "111111111111111", "2222222", "2222222",true);
		drawToOutputStream("D:\\mybook-pie.png", chart, 640, 480);
	}

	private static DefaultPieDataset createPieDataSet1() {
		DefaultPieDataset dataset = new DefaultPieDataset();
		dataset.setValue("java程序设计语言", 10000);
		dataset.setValue("JSP基础与案例开发详解", 20000);
		dataset.setValue("struts基础与案例开发详解", 30000);
		dataset.setValue("精通JSF", 40000);

		return dataset;
	}

	private static DefaultPieDataset createPieDataSet2() {
		DefaultPieDataset dataset = new DefaultPieDataset();
		dataset.setValue(" 市场前期", new Double(10));
		dataset.setValue(" 立项", new Double(15));
		dataset.setValue(" 计划", new Double(10));
		dataset.setValue(" 需求与设计", new Double(10));
		dataset.setValue(" 执行控制", new Double(35));
		dataset.setValue(" 收尾", new Double(10));
		dataset.setValue(" 运维", new Double(10));
		return dataset;
	}

	/**
	 * step1:创建 简单数据集对象
	 * 
	 * @return
	 */
	private static CategoryDataset createBarDataSet1() {
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		dataset.setValue(10000, "", "Corejava");
		dataset.setValue(20000, "", "JavaWeb");
		dataset.setValue(30000, "", "易用struts");
		dataset.setValue(40000, "", "精通JSF");

		return dataset;
	}

	/**
	 * 组合数据集对象
	 * 
	 * @return
	 */
	private static CategoryDataset createBarDataSet2() {
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		dataset.setValue(5000, "北京", "Corejava");
		dataset.setValue(3000, "上海", "Corejava");
		dataset.setValue(2000, "广州", "Corejava");

		dataset.setValue(10000, "北京", "JavaWeb");
		dataset.setValue(6000, "上海", "JavaWeb");
		dataset.setValue(4000, "广州", "JavaWeb");

		dataset.setValue(15000, "北京", "易用struts");
		dataset.setValue(5000, "上海", "易用struts");
		dataset.setValue(10000, "广州", "易用struts");

		dataset.setValue(20000, "北京", "精通JSF");
		dataset.setValue(10000, "上海", "精通JSF");
		dataset.setValue(10000, "广州", "精通JSF");

		return dataset;
	}

}
分享到:
评论

相关推荐

    JFreeChart柱状图的类的封装

    在这个主题中,我们将深入探讨"JFreeChart柱状图的类的封装",了解如何利用这个库来创建柱状图以及相关的类和工具。 首先,JFreeChart的核心类之一是`CategoryPlot`,它是柱状图的基础。`CategoryPlot`负责管理类别...

    关于JFreeChart的封装,配合注解的实现,开发中

    在封装JFreeChart的过程中,开发者可能会创建一个或多个工具类,这些类包含了创建和配置图表的常用方法。这样做的好处是代码结构更清晰,重复代码减少,同时也便于后期维护和扩展。例如,可以有一个`ChartUtils`类,...

    jFreeChart示例代码,封装成jsp标签

    这意味着你可以在 Struts 的 Action 类中处理业务逻辑,然后通过模型传递数据到 JSP,再由 JFreeChart 标签渲染图表。 **5. JSP 标签的灵活性** 使用 JSP 标签可以降低前后端的耦合度,提升代码的可读性和维护性。...

    jfreechart使用的3个jar包

    jcommon 是 JFreeChart 的基础库,它包含了一些通用的工具类和组件,例如颜色管理、日期时间处理、几何形状等。这个库是 JFreeChart 能够正常工作所必需的,因为它为 JFreeChart 提供了底层的支持,比如图形绘制和...

    jfreechart的jar包

    在报表开发中,JFreeChart 是一个强大的工具,能够帮助开发人员创建专业级别的可视化报表。以下是一些使用 JFreeChart 进行报表开发的关键步骤: 1. **数据准备**:首先,你需要整理并准备数据源,这可以是数据库、...

    JAVA图表工具 jfreechart 源码加完整例子

    JFreeChart的核心是`ChartFactory`类,它提供了一系列静态方法来创建不同类型的图表。例如,`createBarChart()`用于创建柱状图,`createLineChart()`用于创建线图。每个图表由四个主要组件构成:主题(Theme)、数据...

    jfreechart英文版api

    Jfreechart_api文档是开发过程中必不可少的工具,它详尽地列出了JFreeChart的类、方法、属性等,帮助开发者理解并正确使用库的各个功能。通过API文档,你可以查找到创建不同图表的具体方法、数据集的创建与操作、...

    jFreeChart简单入门.doc

    接着,通过 `ChartFactory.createPieChart()` 方法生成饼图,该方法接受五个参数,分别是图表标题、数据集、是否显示图例、是否显示工具提示以及是否包含 URL。最后,将生成的图表放入 `ChartFrame` 中展示,`...

    JFreechart自定义图例

    `JFreeChartUtil.java`可能是包含上述自定义操作的工具类,它可能封装了一些便利的方法,用于快速创建和配置自定义图例。而`CustomLegendTitle.java`可能定义了一个继承自`LegendTitle`的类,实现了自定义的图例布局...

    jfreechart 1.0.19 源码加文档和依赖包

    - 数据库报表工具中,JFreeChart可以将数据库查询结果转化为直观的图表展示。 - 科研项目中,JFreeChart用于分析实验数据,生成专业图表。 6. **扩展与兼容性**: - JFreeChart与JavaFX、Swing等图形库兼容,可...

    jfreechart 介绍

    通常,数据被封装在特定的类中,如`XYSeriesCollection`或`DefaultCategoryDataset`,掌握这些类的使用方式是关键。 3. **探索定制选项**:jFreeChart提供了大量的定制选项,从基本的图表样式到高级的交互功能,...

    jfreechart报表教程

    在实际开发中,为了提高代码的可读性和可维护性,建议封装JFreeChart的使用,创建自己的图表工具类或服务。这样,你可以将数据处理、图表创建和定制化逻辑分离开来,使得代码更加模块化。 总之,JFreeChart是一个...

    jfreechart-1.0.17demo源码

    8. **API使用**:源码中的`JFreeChartFactory`类封装了许多创建常见图表的便捷方法,通过研究其源码,可以快速上手JFreeChart的API使用。 总的来说,JFreeChart 1.0.17 Demo 源码是一个宝贵的教育资源,不仅提供了...

    jFreeChart学习总结

    2. **添加依赖库**:将`jfreechart-1.0.6.jar`、`jcommon-1.0.0.jar`和`gnujaxp.jar`等库添加到项目的类路径中。需要注意的是,在某些情况下,`gnujaxp.jar`可能会导致web.xml配置文件出现问题,此时应移除该库。 #...

    jfreechart-1.0.13-src

    每个类都封装了特定的图表功能,例如Title、Legend、Axis等,使得开发者可以通过简单的调用来实现复杂图表的构建。 在源代码中,你会看到许多数据模型的实现,如DefaultCategoryDataset、DefaultPieDataset、Time...

    JfreeChart柱状图饼图

    JFreeChart的源码结构清晰,通过观察`ChartFactory`类的源码,我们可以看到它封装了一系列用于创建不同图表的静态方法。这些方法内部会调用`ChartBuilder`实例来生成图表,如`BarChartBuilder`和`PieChartBuilder`。...

    JFreeChart 股票K线图创建过程

    - 这是生成图表的主要类,它封装了图表的所有属性,如背景颜色、水印、图表类型、轴等。你可以通过 JFreeChart 工厂类创建不同类型的图表,或者直接构建 JFreeChart 对象以获得更高的定制灵活性。 2. **Dataset**...

    JFreeChart.jar & JFreeChart.api

    **JFreeChart.jar** 是JFreeChart库的主要实现文件,它封装了用于生成图表的所有必要类和方法。这个JAR文件包含了丰富的图表组件和定制选项,使得开发者可以轻松地在Java应用程序中集成专业级的可视化元素。例如,你...

    java里用JFreeChart画柱状图、折线图、雷达图

    在Java编程环境中,JFreeChart库是一个强大的工具,用于创建各种复杂的图表,包括柱状图、折线图和雷达图。这些图表对于数据可视化和数据分析非常有用,可以帮助开发者直观地展示大量信息。以下是对给定文件中每个...

    Jfreechart学习笔记3-简单Line图形创建

    总结来说,这篇学习笔记通过`LineChartDemo1.java`的实践示例,介绍了如何利用JFreeChart库中的`XYLine`类(或类似概念)和数据集来构建线性图表。同时,它也强调了如何自定义图表的视觉效果和交互性。如果你是一个...

Global site tag (gtag.js) - Google Analytics