本文介绍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、效果