最近项目中用到一些图标显示,用的是JFreeChart 来做的。做完以后顺便也总结下,方便以后使用中忘记。
一般的快速学习的话,看下Demo 能最快上手,所以我也采取这种形式。
项目首页:http://www.jfree.org/jfreechart/
由于jfreechart 的文档时收费的,不过google 的强大已经解决了。。哈哈。。有它的demo 的源码和文档
下面是一个时间曲线图生成的Demo
package test.chart; import java.awt.Font; import java.io.FileOutputStream; import java.io.IOException; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.title.LegendTitle; import org.jfree.chart.title.TextTitle; import org.jfree.data.general.DefaultPieDataset; import org.jfree.data.time.Month; import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeriesCollection; import org.jfree.data.xy.XYDataset; public class JFreeChartDemo { public static void main(String[] args) throws IOException { JFreeChart chart = ChartFactory.createTimeSeriesChart("图表标题", // 图表标题 "目录轴的显示标签",// 目录轴的显示标签 "数值轴的显示标签",// 数值轴的显示标签 getDataSet(),// 数据集 true, // 是否显示图例 false, // 是否显示工具提示 false);// 是否生成URL // 重新设置图表标题,改变字体 chart.setTitle(new TextTitle("重新设置图表标题", new Font("黑体", Font.ITALIC, 22))); // 取得统计图表的第一个图例 LegendTitle legend = chart.getLegend(0); // 修改图例的字体 legend.setItemFont(new Font("宋体", Font.BOLD, 14)); // 取得时间顺序图的plot 对象 XYPlot plot = (XYPlot) chart.getPlot(); // 取得横轴 ValueAxis categoryAxis = plot.getDomainAxis(); // 设置横轴显示标签的字体 categoryAxis.setLabelFont(new Font("宋体", Font.BOLD, 22)); categoryAxis.setTickLabelFont(new Font("宋体", Font.BOLD, 18)); // 取得纵轴 NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis(); // 设置纵轴的字体 numberAxis.setLabelFont(new Font("宋体", Font.BOLD, 22)); FileOutputStream fos = new FileOutputStream("c:/zhxing.jpg"); // 将图表输出成jpg 文件 ChartUtilities.writeChartAsJPEG(fos,// 输出到哪个输出流 1, // jpeg 图片的质量,0~1之间 chart, // 统计图表对象 800,// 长 600// 宽 ); fos.close(); System.out.println("end!"); } private static XYDataset getDataSet() { // 时间曲线图1 TimeSeries s1 = new TimeSeries("时间顺序图1"); // 该Month 为JFreeChart 自己实现的Month 类,还有其他Day、Year 等,可查看源码得知 s1.add(new Month(1, 2009), 400); s1.add(new Month(2, 2009), 500); s1.add(new Month(3, 2009), 200); // 时间曲线图2 TimeSeries s2 = new TimeSeries("时间顺序图2"); s2.add(new Month(1, 2009), 3700); s2.add(new Month(2, 2009), 3800); s2.add(new Month(3, 2009), 2900); // 用TimeSeriesCollection 来保存多条时间曲线 TimeSeriesCollection dataset = new TimeSeriesCollection(); dataset.addSeries(s1); dataset.addSeries(s2); return dataset; } }
上面的Dome 是参照了struts2 权威指南上的,还有一些图例显示,将在以后再添加进来。。。
看了几个图例的生成,可以总结下大概的步骤:
1、用CharFactory 工厂生成相应的图例,其构造方法基本有些类似。
2、可以重新设置标题(可以发现凡是有文字显示的通常可以设置字体的风格和大小)
3、获取相应的图例对象
4、设置图例对象的一些属性,如字体等。
5、用ChartUtilities可以将图例生成在文件中。
而生成数据阶段则对象生成相应的对象,然后添加数据就可以了。。
在struts2 的项目上,可以参看下面的Demo
public class Struts2Demo extends ActionSupport{ private JFreeChart chart; //获取的action方法 public String LoadChart() throws IOException{ chart=this.gainChart(); return SUCCESS; } /** * 获得图例对象 */ private JFreeChart gainChart() throws IOException{ JFreeChart chart=ChartFactory.createXXXChart( "", "", getDataSet(resultYear,workerid), true, false, false); //other code return chart; } //返回一个XXXXDataSet实例 private XXXDataset getDataSet(){ // other code } public JFreeChart getChart() { return chart; } }
<package name="demo" extends="jfreechart-default"> <action name="Struts2Demo" class="Struts2Demo" method="LoadChart"> <result type="chart"> <param name="width">800</param> <param name="height">600</param> </result> </action> </package>
当然要加上Struts2 中的jfreechart 的插件包
由于时间不够,先记录下这些,以后补充。。