`
wangrusheng5200
  • 浏览: 295784 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jreechart生成图片路径

阅读更多

本文介绍jfreechart在web中怎样确定图片生成的位置

并且包含了一个jfreechart样式工具类。

webfreechar2.rar对折线图做了更新

http://www.jfree.org/

 

1、项目结构

项目结构

2、ChartUtil.java

package com.jfreechart.util;

/**
 * <br>
 * 功能描述:  <br>
 * 版权所有: victor <br>
 * 日期:2009
 * 
 * @author 金鳞
 * @version 1.0
 */
import java.awt.Color;
import java.awt.Font;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.RectangleInsets;
import org.jfree.ui.TextAnchor;

public class ChartUtil {
	/*
	 * 报表字体
	 */
	private static final Font CHART_FONT = new Font("宋体", 12, 12);
	// 配置字体
	private static final Font titlefont = new Font("隶书", Font.BOLD, 24);// 图片标题字体大小,样式
	private static final Font xfont = new Font("宋体", Font.PLAIN, 18);// X轴字体大小,样式
	private static final Font yfont = new Font("宋体", Font.PLAIN, 18);// y轴字体大小,样式
	private static final Font illustrationfont = new Font("宋体", Font.PLAIN, 18);// 底部字体大小,样式

	/**
	 * 获得一个时间轴报表图(暂时不使用)
	 * 
	 * @param title
	 *            标题
	 * @param xSubject
	 *            X轴标题
	 * @param ySubject
	 *            Y轴标题
	 * @param dataset
	 *            数据源
	 * @return 报表
	 */
	public static JFreeChart getTimeSeriesChart(String title, String xSubject,
			String ySubject, XYDataset dataset) {
		JFreeChart chart = ChartFactory.createTimeSeriesChart(title, xSubject,
				ySubject, dataset, true, true, false);

		chart.setBackgroundPaint(new Color(230, 239, 248));

		XYPlot plot = (XYPlot) chart.getPlot();
		plot.setBackgroundPaint(Color.lightGray);
		plot.setDomainGridlinePaint(Color.white);
		plot.setRangeGridlinePaint(Color.white);
		plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
		plot.setDomainCrosshairVisible(true);
		plot.setRangeCrosshairVisible(true);

		XYItemRenderer r = plot.getRenderer();
		if (r instanceof XYLineAndShapeRenderer) {
			XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;
			renderer.setBaseShapesVisible(true);
			renderer.setBaseShapesFilled(true);
			renderer.setDrawSeriesLineAsPath(true);
		}

		// DateAxis axis = plot.getDomainAxis();
		// axis.setDateFormatOverride(new SimpleDateFormat("MMM-yyyy"));
		plot.setNoDataMessage("没有数据显示");

		// 设置字体,解决中文乱码问题
		chart.getTitle().setFont(CHART_FONT);
		chart.getLegend().setItemFont(CHART_FONT);
		// plot.getRangeAxis().setLabelFont(CHART_FONT);
		plot.getDomainAxis().setLabelFont(new Font("宋体", 12, 24));
		return chart;
	}

	/**
	 * <br>
	 * 方法说明:设置柱状图样式 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public static void barStyle(JFreeChart chart) {
		CategoryPlot plot = chart.getCategoryPlot();// 图表的绘制结构对象
		// 设置图表标题字体
		chart.setTitle(new TextTitle(chart.getTitle().getText(), titlefont));
		// X轴
		CategoryAxis domainAxis = plot.getDomainAxis();
		domainAxis.setLabelFont(xfont);// 设置X轴标签字体大小
		domainAxis.setLabelPaint(Color.BLUE); // 设置X轴标签字体颜色
		domainAxis.setTickLabelFont(xfont);// 设置X轴数值的字体大小
		domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);// 横轴上的标签字体的显示样式,比如说:正斜体,反斜体,标准等等,
		// Y轴
		ValueAxis rangeAxis = plot.getRangeAxis();
		rangeAxis.setLabelFont(yfont);// 设置Y轴标签字体的大小,样式
		rangeAxis.setLabelPaint(Color.BLUE);// 设置Y轴标签字体颜色
		rangeAxis.setTickLabelFont(yfont);// 设置Y轴上的数字的字体大小
		// 如果存在图例信息,设置图例字体
		if (chart.getLegend() != null) {
			chart.getLegend().setItemFont(illustrationfont);
		}
		// 图表其他特性
		BarRenderer3D renderer = new BarRenderer3D();
		// 显示每个柱的数值,并修改该数值的字体属性
		renderer
				.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		renderer.setItemLabelFont(new Font("宋体", Font.PLAIN, 12));
		renderer.setItemLabelsVisible(true);
		plot.setRenderer(renderer);

	}

	/**
	 * <br>
	 * 方法说明:设置饼图样式 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public static void pieStyle(JFreeChart chart) {
		// 设置图表标题字体
		chart.setTitle(new TextTitle(chart.getTitle().getText(), titlefont));
		PiePlot3D plot = (PiePlot3D) chart.getPlot();
		// 设置饼图的图例标签的字体样式
		chart.getLegend().setItemFont(illustrationfont);
		// 指定饼图轮廓线的颜色
		plot.setBaseSectionOutlinePaint(Color.BLACK);
		// 设置无数据时的信息
		plot.setNoDataMessage("无对应的数据,请重新查询。");
		// 设置无数据时的信息显示颜色
		plot.setNoDataMessagePaint(Color.red);
		// 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位
		plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
				"{0}={1}({2})", NumberFormat.getNumberInstance(),
				new DecimalFormat("0.00%")));
		// 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例
		// plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator(
		// "{0}={1}({2})"));
		plot.setLabelFont(new Font("SansSerif", Font.TRUETYPE_FONT, 12));
		// // 设置分饼颜色
		// plot.setSectionPaint(pieKeys[0], new Color(244, 194, 144));
		// plot.setSectionPaint(pieKeys[1], new Color(144, 233, 144));

	}

	/**
	 * <br>
	 * 方法说明:设置曲线图样式 <br>
	 * 输入参数: <br>
	 * 返回类型:
	 */
	public static void timeSeriesStyle(JFreeChart chart) {
		// 设置图表标题字体
		chart.setTitle(new TextTitle(chart.getTitle().getText(), titlefont));
		// 设置折线图的图例标签的字体样式
		chart.getLegend().setItemFont(illustrationfont);
		CategoryPlot plot = (CategoryPlot) chart.getPlot();
		// x轴 // 分类轴网格是否可见
		plot.setDomainGridlinesVisible(true);
		// y轴 //数据轴网格是否可见
		plot.setRangeGridlinesVisible(true);

		CategoryAxis domainAxis = plot.getDomainAxis();
		domainAxis.setLabelFont(xfont);// X 轴标题
		domainAxis.setTickLabelFont(xfont);// x 轴数值

		domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 横轴上的
		ValueAxis rangeAxis = plot.getRangeAxis();
		rangeAxis.setLabelFont(yfont);// 设置Y轴字体的大小,样式
		rangeAxis.setLabelPaint(Color.BLUE);// 设置Y轴标签字体颜色
		rangeAxis.setTickLabelFont(yfont);// 设置Y轴上的数字的字体大小
		// 获得renderer
		LineAndShapeRenderer renderer = new LineAndShapeRenderer();

		renderer.setBaseShapesVisible(true); // series 点(即数据点)可见
		renderer.setBaseLinesVisible(true); // series 点(即数据点)间有连线可见
		renderer.setBaseItemLabelsVisible(true);
		renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(
				ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
		renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		renderer.setBaseItemLabelFont(new Font("Dialog", 1, 12));
		plot.setRenderer(renderer);
	}
}

 3、ChartServlet.java

package com.victor.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

import com.jfreechart.util.ChartUtil;

public class ChartServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		 String path = getPath() + "fruit.jpg";
		File file = new File(path);
		System.out.print(path);
		if (!file.exists()){
			System.out.print(path);
			getBarChart(path);
		}
		response.sendRedirect("chart.jsp");
	}

	private String getPath() {
		// 获得当前class文件路径
		String path = this.getClass().getClassLoader().getResource("")
				.getPath();

		path = path.substring(1, path.length()-16);
		return path;
	}

	public static void getBarChart(String path) throws IOException {
		CategoryDataset dataset = getDataSet2();
		// 获取柱状图
		JFreeChart chart = ChartFactory.createBarChart3D("水果产量"// 图表标题
				, "水果"// X轴标题
				, "产量"// Y轴标题
				, dataset// 数据集
				, PlotOrientation.VERTICAL// 图表方向:水平、垂直
				, false// 是否显示图例(对于简单的柱状图必须是false)
				, true// 是否生成工具
				, false// 是否生成URL链接
				);
		// 设置图表样式
		ChartUtil.barStyle(chart);
		FileOutputStream fos_jpg = null;
		try {
			fos_jpg = new FileOutputStream(path);

			ChartUtilities.writeChartAsJPEG(fos_jpg, 0.9f// 分辨率
					, chart, 650, 300, null);

		} finally {
			try {
				fos_jpg.close();
			} catch (Exception e) {
			}
		}
	}

	/**
	 * 获取一个演示用的组合数据集对象
	 * 
	 * @return
	 */
	public static CategoryDataset getDataSet2() {
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		dataset.addValue(100, "北京", "苹果");
		dataset.addValue(100, "上海", "苹果");
		dataset.addValue(100, "广州", "苹果");
		dataset.addValue(200, "北京", "梨子");
		dataset.addValue(200, "上海", "梨子");
		dataset.addValue(200, "广州", "梨子");
		dataset.addValue(300, "北京", "葡萄");
		dataset.addValue(300, "上海", "葡萄");
		dataset.addValue(300, "广州", "葡萄");
		dataset.addValue(400, "北京", "香蕉");
		dataset.addValue(400, "上海", "香蕉");
		dataset.addValue(400, "广州", "香蕉");
		dataset.addValue(500, "北京", "荔枝");
		dataset.addValue(500, "上海", "荔枝");
		dataset.addValue(500, "广州", "荔枝");
		return dataset;
	}

}

 4、web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <servlet>
    <servlet-name>ChartServlet</servlet-name>
    <servlet-class>com.victor.servlet.ChartServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ChartServlet</servlet-name>
    <url-pattern>/ChartServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 5、效果

 

  • 大小: 8.9 KB
  • 大小: 67.6 KB
1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics