遇到问题:
windows下图片中文显示乱码--这个主要是由于没有给中文设置字体造成的
某些linux下图片中文显示乱码--这个主要是由于该linux系统缺乏中文字体,向linux的字体目录下导入中文字体即可(具体方法网上很多)
这两种问题本人已测试通过。
本例使用struts2框架,导入jfreechart-1.0.13.jar和struts2-jfreechart-plugin-2.2.1.1.jar
1.带热点饼图的Action
com.milton.hot.FirstChart
- package com.milton.hot;
- import java.awt.Color;
- import java.awt.Font;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.struts2.ServletActionContext;
- import org.jfree.chart.ChartFactory;
- import org.jfree.chart.ChartRenderingInfo;
- import org.jfree.chart.ChartUtilities;
- import org.jfree.chart.JFreeChart;
- import org.jfree.chart.entity.StandardEntityCollection;
- import org.jfree.chart.labels.StandardPieToolTipGenerator;
- import org.jfree.chart.plot.PiePlot;
- import org.jfree.chart.servlet.ServletUtilities;
- import org.jfree.chart.title.LegendTitle;
- import org.jfree.chart.title.TextTitle;
- import org.jfree.chart.urls.StandardPieURLGenerator;
- import org.jfree.data.general.DefaultPieDataset;
- import com.opensymphony.xwork2.ActionSupport;
- /**
- *
- * 带热点的饼图
- * @author Milton
- *
- */
- public class FirstChart extends ActionSupport
- {
- private String mapMessage;
- private String src;
- /**
- * 生成饼图
- */
- public String execute() throws Exception
- {
- //设置数据
- DefaultPieDataset data = new DefaultPieDataset();
- data.setValue("三星I9000", 10000);
- data.setValue("HTC G7", 20000);
- data.setValue("HTC G2", 15000);
- data.setValue("诺基亚5230", 16000);
- data.setValue("摩托罗拉ME525", 50000);
- //生成JFreeChart对象
- JFreeChart chart = ChartFactory
- .createPieChart3D("手机销量统计图", data, true, true, true);
- chart.setTitle(new TextTitle("手机销量统计图", new Font("隶书", Font.BOLD, 25)));
- //建一个图例
- LegendTitle legendTitle = chart.getLegend(0);
- //设置图例字体
- legendTitle.setItemFont(new Font("宋体",Font.BOLD,14));
- PiePlot plot = (PiePlot) chart.getPlot();
- //根据key指定各个数据饼图的颜色
- plot.setSectionPaint("三星I9000", Color.RED);
- plot.setSectionPaint("HTC G7", Color.BLUE);
- plot.setSectionPaint("HTC G2", Color.GREEN);
- plot.setSectionPaint("诺基亚5230", Color.ORANGE);
- plot.setSectionPaint("摩托罗拉ME525", Color.GRAY);
- //设置plot字体
- plot.setLabelFont(new Font("宋体",Font.BOLD,18));
- //设置背景透明度(0~1)
- plot.setBackgroundAlpha(0.1f);
- //设置热点
- plot.setNoDataMessage("No data available");
- plot.setURLGenerator(new StandardPieURLGenerator("second.jsp", "type"));
- plot.setToolTipGenerator(new StandardPieToolTipGenerator());
- StandardEntityCollection sec = new StandardEntityCollection();
- //生成RenderingInfo实例,info参数就是图片的热点信息
- ChartRenderingInfo info = new ChartRenderingInfo(sec);
- HttpServletRequest request = ServletActionContext.getRequest();
- String filename = ServletUtilities.saveChartAsJPEG(chart, 750, 300, info, request.getSession());
- mapMessage = ChartUtilities.getImageMap("map0", info);
- src = request.getContextPath()+"/DisplayChart?filename=" + filename;
- return "first";
- }
- public void setMapMessage(String mapMessage)
- {
- this.mapMessage = mapMessage;
- }
- public void setSrc(String src)
- {
- this.src = src;
- }
- public String getMapMessage()
- {
- return mapMessage;
- }
- public String getSrc()
- {
- return src;
- }
- }
2.热点链接进去后的柱状图的Action
com.milton.hot.SecondChart
- package com.milton.hot;
- import java.awt.Color;
- import java.awt.Font;
- import javax.servlet.http.HttpServletRequest;
- import org.apache.struts2.ServletActionContext;
- 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.NumberAxis;
- import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
- import org.jfree.chart.plot.CategoryPlot;
- import org.jfree.chart.plot.PlotOrientation;
- import org.jfree.chart.renderer.category.BarRenderer3D;
- import org.jfree.chart.title.TextTitle;
- import org.jfree.data.category.DefaultCategoryDataset;
- import com.opensymphony.xwork2.ActionSupport;
- public class SecondChart extends ActionSupport
- {
- private JFreeChart chart;
- /**
- * 生成柱状图
- */
- public String execute() throws Exception
- {
- HttpServletRequest request = ServletActionContext.getRequest();
- String type = new String(request.getParameter("type").getBytes("ISO_8859_1"), "UTF-8");
- if(type.equals("Java"))
- {
- //根据类型做不同处理
- }
- //中文必须设置字体,否则页面显示小方块
- Font xfont = new Font("宋体", Font.PLAIN, 20);// X轴
- Font yfont = new Font("宋体", Font.PLAIN, 12);// Y轴
- Font kfont = new Font("宋体", Font.PLAIN, 12);// 底部
- Font titleFont = new Font("隶书", Font.BOLD, 25); // 图片标题
- DefaultCategoryDataset data = new DefaultCategoryDataset();
- data.addValue(15000, "", "第一季度");
- data.addValue(10000, "", "第二季度");
- data.addValue(20000, "", "第三季度");
- data.addValue(5000, "", "第四季度");
- chart = ChartFactory.createBarChart3D(
- type+"季度销量统计图",//图表标题
- "季度",//横轴显示标签
- "销量",//纵轴显示标签
- data,//数据集
- PlotOrientation.VERTICAL,//设置图表方向 (水平、垂直)
- false,//是否显示图例(对于简单的柱状图必须是false)
- false,//是否生成工具
- true//是否生成URL链接
- );
- //设置标题
- chart.setTitle(new TextTitle(type+"季度销量统计图", titleFont));