JFreeChart应用

1.servlet

package com.logcd.servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.RenderingHints;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;

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.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.labels.StandardXYItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.Dataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.TextAnchor;
import org.jfree.util.Rotation;

public class JChartServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

private static enum ChartType {
BarChart,BarChart3D,PieChart,PieChart3D,LineChart,LineChart3D,XYLineChart
}

/**
* 处理请求
*/
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
String type = request.getParameter("type");
ChartType chartType = getChartType(Integer.parseInt(type));

response.setContentType("image/jpeg");

JFreeChart chart = createChart(getDataSet(chartType),chartType);
setChartStyle(chart);

ChartUtilities.writeChartAsJPEG(response.getOutputStream(), 0.9f, chart,
480, 350, null);

}

/**
* 创建图表
* @param dataset
* @param chartType
* @return
*/
public static JFreeChart createChart(Dataset dataset,ChartType chartType){
JFreeChart chart = null;

switch(chartType){
case BarChart:
chart = ChartFactory.createBarChart("水果产量图",// 图表标题
"水果种类",// X轴的显示标签
"产量",// Y轴的显示标签
(CategoryDataset)dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true,//是否显示图例(对于简单的柱状图必须是false)
false,
false);//是否生成URL链接
break;

case BarChart3D:
chart = ChartFactory.createBarChart3D("水果产量图",// 图表标题
"水果种类",// X轴的显示标签
"产量",// Y轴的显示标签
(CategoryDataset)dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true,//是否显示图例(对于简单的柱状图必须是false)
false,//是否启用提示
false);//是否生成URL链接
break;

case PieChart:
chart = ChartFactory.createPieChart("水果产量图", (DefaultPieDataset)dataset, true,
false, false);
break;

case PieChart3D:
chart = ChartFactory.createPieChart3D("水果产量图", (DefaultPieDataset)dataset, true,
false, false);
break;

case LineChart:
chart = ChartFactory.createLineChart("水果产量图", "水果种类",
"产量", (CategoryDataset)dataset, PlotOrientation.VERTICAL, true,
false, false);
break;

case LineChart3D:
chart = ChartFactory.createLineChart3D("水果产量图", "水果种类",
"产量", (CategoryDataset)dataset, PlotOrientation.VERTICAL, true,
false, false);
break;

case XYLineChart:
chart = ChartFactory.createXYLineChart("苹果产量图", "月份",
"产量", (XYDataset)dataset, PlotOrientation.VERTICAL, true,
false, false);
break;
}

return chart;
}

/**
* 设置chart风格
*
* @param chart
*/
public static void setChartStyle(JFreeChart chart) {
// 设置一个背景,从渐到深的倾斜
chart.setBackgroundPaint(new GradientPaint(0.0F, 0.0F, Color.PINK,
10000F, 0.0F, Color.YELLOW));

chart.getTitle().setFont(new Font("SimSun", Font.BOLD, 12));// 标题的字体
Font font = new Font("黑体", Font.TRUETYPE_FONT, 10);// 公用字体

LegendTitle legend = (LegendTitle) chart.getLegend();// 图例
legend.setItemFont(font);

chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
Plot plot = chart.getPlot();

if (plot instanceof CategoryPlot) {
CategoryPlot categryPlot = (CategoryPlot) chart.getPlot();// 图表层
plot.setBackgroundAlpha(0.6f);
plot.setForegroundAlpha(0.9F);// 设置透明度

CategoryAxis domain_axis = categryPlot.getDomainAxis();
domain_axis.setTickLabelFont(font);// X轴标尺字体
domain_axis.setLabelFont(font);// X轴标题标签字体
//横坐标数据倾斜45度
//domain_axis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);

ValueAxis value_axis = categryPlot.getRangeAxis();
value_axis.setTickLabelFont(font);// Y轴标尺字体
value_axis.setLabelFont(font);// Y轴标题标签字体

// VALUE_TEXT_ANTIALIAS_OFF表示将文字的抗锯齿关闭
chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);

CategoryItemRenderer renderer = chart.getCategoryPlot().getRenderer();
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
//设置item(bar)标签值的位置是在上面还是在bar内
renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_CENTER));
if(renderer instanceof LineAndShapeRenderer){
((LineAndShapeRenderer)renderer).setBaseShapesVisible(true);//显示折线图上的数据标志
}
if(renderer instanceof BarRenderer3D){
((BarRenderer3D)renderer).setItemLabelAnchorOffset(10D);// 设置柱形图上的文字偏离值
}
renderer.setBaseItemLabelFont(new Font("Serif", Font.PLAIN, 10));
renderer.setBaseItemLabelsVisible(true);

}

if (plot instanceof PiePlot) {
// 得到3D饼图的plot对象
PiePlot piePlot = (PiePlot) chart.getPlot();
plot.setBackgroundAlpha(0.6f);
// 设置旋转角度
piePlot.setStartAngle(290);
// 设置旋转方向:顺时针方向
piePlot.setDirection(Rotation.CLOCKWISE);
// 设置透明度
piePlot.setForegroundAlpha(0.5f);
piePlot.setLabelFont((new Font("宋体", Font.PLAIN, 12)));

piePlot.setLabelGenerator(new StandardPieSectionLabelGenerator(
"{0}:{1}({2})"));//名称、值、百分比
//设置扇区边框不可见
piePlot.setSectionOutlinesVisible(false);
if(!(plot instanceof PiePlot3D)){
//设置扇区分离显示
piePlot.setExplodePercent("苹果", 0.2D);
}

}

if(plot instanceof XYPlot){
XYPlot xyPlot = (XYPlot) chart.getPlot();
xyPlot.setBackgroundAlpha(0.6f);

ValueAxis domain_axis = xyPlot.getDomainAxis();
domain_axis.setTickLabelFont(font);
domain_axis.setLabelFont(font);

ValueAxis range_axis = xyPlot.getRangeAxis();
range_axis.setTickLabelFont(font);
range_axis.setLabelFont(font);

XYLineAndShapeRenderer renderer
= (XYLineAndShapeRenderer) xyPlot.getRenderer();
renderer.setBaseShapesVisible(true);//显示数据标志
renderer.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
renderer.setBaseItemLabelsVisible(true);
renderer.setBaseItemLabelFont(font);

}
}

public static ChartType getChartType(Integer type){
ChartType chartType = ChartType.PieChart;
switch(type){
case 0: chartType = ChartType.BarChart;
break;
case 1: chartType = ChartType.BarChart3D;
break;
case 2: chartType = ChartType.PieChart;
break;
case 3: chartType = ChartType.PieChart3D;
break;
case 4: chartType = ChartType.LineChart;
break;
case 5: chartType = ChartType.LineChart3D;
break;
case 6: chartType = ChartType.XYLineChart;
break;
}
return chartType;
}

/**
* 获取一个演示用的简单数据集对象
*
* @return
*/
private static Dataset getDataSet(ChartType type) {
switch(type){
case BarChart :
case BarChart3D:
case LineChart:
case LineChart3D:
DefaultCategoryDataset categorydataset = new DefaultCategoryDataset();
categorydataset.addValue(100, "北京", "苹果");
categorydataset.addValue(70, "上海", "苹果");
categorydataset.addValue(120, "广州", "苹果");
categorydataset.addValue(220, "北京", "梨子");
categorydataset.addValue(260, "上海", "梨子");
categorydataset.addValue(300, "广州", "梨子");
categorydataset.addValue(320, "北京", "葡萄");
categorydataset.addValue(370, "上海", "葡萄");
categorydataset.addValue(320, "广州", "葡萄");
categorydataset.addValue(490, "北京", "香蕉");
categorydataset.addValue(450, "上海", "香蕉");
categorydataset.addValue(400, "广州", "香蕉");
categorydataset.addValue(200, "北京", "荔枝");
categorydataset.addValue(230, "上海", "荔枝");
categorydataset.addValue(340, "广州", "荔枝");
return categorydataset;
case PieChart:
case PieChart3D:
DefaultPieDataset pieDataset = new DefaultPieDataset();
pieDataset.setValue("苹果", 100);
pieDataset.setValue("梨子", 200);
pieDataset.setValue("葡萄", 300);
pieDataset.setValue("香蕉", 400);
pieDataset.setValue("荔枝", 500);
return pieDataset;
case XYLineChart:
XYSeriesCollection xyDataset = new XYSeriesCollection();
XYSeries apple = new XYSeries("苹果");
for(int i=0;i<12;i++){
apple.add(i+1, (int)(500*Math.random()));
}
xyDataset.addSeries(apple);
return xyDataset;
}
return null;
}

}

2.web.xml

<servlet>
<servlet-name>JChartServlet</servlet-name>
<servlet-class>com.logcd.servlet.JChartServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JChartServlet</servlet-name>
<url-pattern>/jChartImg</url-pattern>
</servlet-mapping>

3.html中调用

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>JChart Test</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>

<body>
<img src="./jChartImg?type=0"/>
<img src="./jChartImg?type=1"/>
<img src="./jChartImg?type=2"/>
<img src="./jChartImg?type=3"/>
<img src="./jChartImg?type=4"/>
<img src="./jChartImg?type=5"/>
<img src="./jChartImg?type=6"/>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值