本文介绍jfreechart在web中怎样确定图片生成的位置
并且包含了一个jfreechart样式工具类。
webfreechar2.rar对折线图做了更新
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、效果