JFreeChart配置安装
1、解压jfreechart_0.9.21.zip到指定位置,其中source是jfreechart的源码,jfreechart-0.9.21-demo.jar
是例子程序(该部分留给大家自己去研究)
2、为了配置成功,我们需要关注的文件有如下三个:jfreechart-0.9.21.jar、lib\jcommon-0.9.6.jar、
lib\gnujaxp.jar
3、如果是Application开发,把上述三个文件拷贝到%JAVA_HOME%\LIB中,同时在环境变量CLASSPATH中加入
如果是WEB开发,以TOMCAT中的一个WEB项目TEST为例子说明:
把上述三个文件拷贝到TEST\WEB-INF\LIB中,然后修改TEST\WEB-INF\web.xml文件,在其中加入如下代码:
<servlet>
<servlet-name>DisplayChart</servlet-name>
<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayChart</servlet-name>
<url-pattern>/servlet/DisplayChart</url-pattern>
</servlet-mapping>
至此jfreechart的配置就完成了,下面就可以进行jfreechart的开发了。这里值得提出的是jfreechart的类
结构设计前后兼容性不是很好,不同版本的jfreechart中类库结构可能不一样,有时候可能需要查源码。如果
是中文显示的时候可能依据观感需要改变源码的字体,不过我个人觉得这个版本比以前版本要好一些。
JFreeChart开发
package dao;
import java.awt.Color;
import java.awt.Font;
import java.io.PrintWriter;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.entity.StandardEntityCollection;
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.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.ui.TextAnchor;
public class FreeChartCommon {
static String graphURL1 = null;
/**
* 饼状图
*/
public static JFreeChart generatePieChart(String xml) {
PieDataset dataset = getDataSet(xml);
JFreeChart chart = ChartFactory.createPieChart3D("纳税考评信息饼状图", // 图表标题
dataset, // 数据集
true, // 是否显示图例
false, // 是否生成工具
false // 是否生成URL链接
);
chart.setBackgroundPaint(Color.pink);
chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));
chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10));
PiePlot3D plot = (PiePlot3D) chart.getPlot();
plot.setLabelFont(new Font("SansSerif",Font.BOLD,12));
plot.setCircular(true);
plot.setLabelGap(0.01D);//间距
//图片中显示百分比:默认方式
//设置无数据时的信息
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})"));
return chart;
}
/**
* 柱状图
*/
public static JFreeChart generateBarChart(String xml) {
CategoryDataset dataset = getDataSet2(xml);
JFreeChart chart = ChartFactory.createBarChart3D("纳税考评信息柱状图", // 图表标题
"", // 目录轴的显示标签
"", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
false, // 是否生成工具
false // 是否生成URL链接
);
//显示每个柱的数值,并修改该数值的字体属性
chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));
chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10));
CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象
CategoryAxis domainAxis=plot.getDomainAxis();
//水平底部列表
domainAxis.setLabelFont(new Font("宋体",Font.BOLD,14));
//水平底部标题
domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12));
//垂直标题
ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状
rangeAxis.setLabelFont(new Font("宋体",Font.BOLD,15));
CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
categoryplot.setNoDataMessage("无对应的数据,请重新查询。");
categoryplot.getRenderer().setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
categoryplot.getRenderer().setItemLabelsVisible(true);
categoryplot.getRenderer().setPositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12,
TextAnchor.BOTTOM_LEFT));
BarRenderer3D renderer = new BarRenderer3D();
renderer.setItemLabelGenerator( new StandardCategoryItemLabelGenerator());
renderer.setItemLabelsVisible( true );
return chart;
}
/**
* 折线图
*/
public static JFreeChart generateLineChart(String xml) {
CategoryDataset dataset = getDataSet3(xml);
JFreeChart chart = ChartFactory.createLineChart("纳税考评折线图", // 图表标题
"", // 目录轴的显示标签
"", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
false, // 是否生成工具
false // 是否生成URL链接
);
/*------------配置图表属性--------------*/
// 1,设置整个图表背景颜色
chart.setBackgroundPaint(Color.pink);
/*------------设定Plot参数-------------*/
CategoryPlot plot = chart.getCategoryPlot();
// 2,设置详细图表的显示细节部分的背景颜色
// plot.setBackgroundPaint(Color.PINK);
// 3,设置垂直网格线颜色
plot.setDomainGridlinePaint(Color.black);
// 4,设置是否显示垂直网格线
plot.setDomainGridlinesVisible(true);
// 5,设置水平网格线颜色
plot.setRangeGridlinePaint(Color.blue);
// 6,设置是否显示水平网格线
plot.setRangeGridlinesVisible(true);
/*----------设置消除字体的锯齿渲染(解决中文问题)--------------*/
//显示每个柱的数值,并修改该数值的字体属性
chart.getTitle().setFont(new Font("宋体", Font.BOLD, 15));
chart.getLegend().setItemFont(new Font("宋体", Font.BOLD, 15));
CategoryAxis domainAxis = plot.getDomainAxis();
/*------设置X轴坐标上的文字-----------*/
domainAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 11));
/*------设置X轴的标题文字------------*/
domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
NumberAxis numberaxis = (NumberAxis) plot.getRangeAxis();
/*------设置Y轴坐标上的文字-----------*/
numberaxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 12));
/*------设置Y轴的标题文字------------*/
numberaxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
numberaxis.setAutoRangeIncludesZero(true);
numberaxis.setUpperMargin(0.20);
numberaxis.setLabelAngle(Math.PI / 2.0);
chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,10));
// 获得renderer 注意这里是下嗍造型到lineandshaperenderer!!
LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)plot.getRenderer();
//
lineandshaperenderer.setBaseShapesVisible(true); // series 点(即数据点)可见
lineandshaperenderer.setBaseLinesVisible(true); // series 点(即数据点)间有连线可见
//显示折点数据
lineandshaperenderer.setBaseItemLabelGenerator(new
StandardCategoryItemLabelGenerator());
lineandshaperenderer.setBaseItemLabelsVisible(true);
return chart;
}
/**
* 获取一个饼状图的简单数据集对象
*
* @return
*/
private static PieDataset getDataSet(String xml) {
DefaultPieDataset dataset = new DefaultPieDataset();
// try {
// xml = "<ROOT>" + xml + "</ROOT>";
// Document document = DocumentHelper.parseText(xml);
// // 读取ITEM
// List list = document.selectNodes("//ITEM");
// // 获取NODE细节
// Iterator it = list.iterator();
//
// while (it.hasNext()) {
// Node node = (Node) it.next();
// /**
// *
// */
// dataset.setValue(Tools.nullToSpace(node.valueOf("HZFS")), Double.parseDouble(node.valueOf("XMMC")));
//
// }
//
// } catch (Exception e) {
//
// e.printStackTrace();
//
// }
dataset.setValue("管理人员啊", 10.02D);
dataset.setValue("市场人员啊", 20.23D);
dataset.setValue("开发人员啊", 60.02D);
dataset.setValue("OEM人员啊", 10.02D);
dataset.setValue("其他人员啊", 5.11D);
dataset.setValue("其他人员啊3", 5.11D);
return dataset;
}
/**
* 获取一个柱状图数据集对象
*
* @return
*/
private static CategoryDataset getDataSet2(String xml) {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
// try {
// xml = "<ROOT>" + xml + "</ROOT>";
// Document document = DocumentHelper.parseText(xml);
// // 读取ITEM
// List list = document.selectNodes("//ITEM");
// // 获取NODE细节
// Iterator it = list.iterator();
// while (it.hasNext()) {
// Node node = (Node) it.next();
// dataset.setValue(Double.parseDouble(node.valueOf("XMMC")), Tools
// .nullToSpace(node.valueOf("HZFS")), Tools.nullToSpace(node
// .valueOf("HZFS")));
// }
//
// } catch (Exception e) {
//
// e.printStackTrace();
//
// }
// 各曲线名称
String series1 = "计划";
String series2 = "营销";
String series3 = "开发";
// 横轴名称(列名称)
String type1 = "管理人员";
String type2 = "市场人员";
String type3 = "开发人员";
dataset.setValue(10.02D,series1,type1);
dataset.setValue(10.02D,series1,type2);
dataset.setValue(10.02D,series1,type3);
dataset.setValue(40.02D,series2,type1);
dataset.setValue(40.02D,series2,type2);
dataset.setValue(80.02D,series2,type3);
dataset.setValue(50.02D,series3,type1);
dataset.setValue(50.02D,series3,type2);
dataset.setValue(60.02D,series3,type3);
return dataset;
}
/**
* 获取一个折线图数据集对象
*
* @return
*/
public static CategoryDataset getDataSet3(String xml) {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
// try {
// xml = "<ROOT>" + xml + "</ROOT>";
// Document document = DocumentHelper.parseText(xml);
// // 读取ITEM
// List list = document.selectNodes("//ITEM");
// // 获取NODE细节
// Iterator it = list.iterator();
//
// while (it.hasNext()) {
// Node node = (Node) it.next();
// dataset.setValue(Double.parseDouble(node.valueOf("ZF")), Tools
// .nullToSpace(node.valueOf("XMMC")), Tools.nullToSpace(node
// .valueOf("NF")));
// }
// } catch (Exception e) {
//
// e.printStackTrace();
//
// }
// 各曲线名称
String series1 = "管理人员";
String series2 = "市场人员";
String series3 = "开发人员";
// 横轴名称(列名称)
String type1 = "计划";
String type2 = "营销";
String type3 = "洗衣机";
dataset.setValue(0.0, series1, type1);
dataset.setValue(4.2, series1, type2);
dataset.setValue(3.9, series1, type3);
dataset.setValue(1.0, series2, type1);
dataset.setValue(5.2, series2, type2);
dataset.setValue(7.9, series2, type3);
dataset.setValue(2.0, series3, type1);
dataset.setValue(9.2, series3, type2);
dataset.setValue(8.9, series3, type3);
return dataset;
}
/**
*
* @param request
* @param session
* @param out
* @param xml
* @param x 1表示折线图,2表示饼图,3表示柱状图
* @return
*/
public static String getGraphUrl(HttpServletRequest request, HttpSession session,
PrintWriter out,String xml,int x) {
JFreeChart chart=null;
if(x==1){
chart=generateLineChart(xml);
}
if(x==2){
chart=generatePieChart(xml);
}
if(x==3){
chart=generateBarChart(xml);
}
StandardEntityCollection sec = new StandardEntityCollection();
ChartRenderingInfo info = new ChartRenderingInfo(sec);
try {
String filename = ServletUtilities.saveChartAsJPEG(chart, 500, 300,
info, null);
graphURL1 = request.getContextPath()
+ "/servlet/DisplayChart?filename=" + filename;
} catch (Exception e) {
System.out.println("error happens---" + e.toString());
}
return graphURL1;
}
}
package navigate;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import common.Tools;
import dao.FreeChartCommon;
public class JfreeChar_Test extends HttpServlet {
/**
* Constructor of the object.
*/
public JfreeChar_Test() {
super();
}
/**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=GBK");
response.setHeader("Cache-Control", "no-cache");
PrintWriter out = response.getWriter();
String method = request.getParameter("method");
String xml=request.getParameter("xml");
if (method == null) {
method = "";
}
if (xml == null) {
xml = "";
}
String filename="";
if(method.equals("line"))
{
filename=FreeChartCommon.getGraphUrl(request,request.getSession(),out,Tools.editStr(xml),1);
out.print(filename);
}
if(method.equals("pie"))
{
filename=FreeChartCommon.getGraphUrl(request,request.getSession(),out,Tools.editStr(xml),2);
out.print(filename);
}
if(method.equals("bar"))
{
filename=FreeChartCommon.getGraphUrl(request,request.getSession(),out,Tools.editStr(xml),3);
out.print(filename);
}
}
}
页面:
<img id="imagetu" src="<%=request.getContextPath()%>/servlet/JfreeChar_Test?method=pie">
这也是我从网上摘抄的,供大家参阅。