JFreeChart简单介绍及用法(入门)

1.jfreechart简单介绍以及jar包下载

首先了解JFreeChart是什么,它是JAVA平台上的一个开源报表系统(开放的图表绘制类库),通过它可以生成柱状图,饼状图,散点图,折线图等多种图形。
jfreechart的主页是http://www.jfree.org/jfreechart/index.html
jfreechart的使用需要先下载jar包,并导入到相关项目中,jfreechart/lib下

  • jfreechart-1.0.19.jar
  • jcommon-1.0.23.jar

2.制作一张柱状图并保存在电脑上

代码:(源码来自百度和博客,后有修改,侵删致歉

import java.awt.Color;
import java.awt.Font;
import java.io.*; 
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.chart.*; 
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.*; 
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.title.TextTitle;
 
public class TestJFreeChart { 
    public static void main(String[] args) throws IOException{ 
        CategoryDataset dataset = getDataSet2(); 
        JFreeChart chart = ChartFactory.createBarChart3D( 
                           "水果产量图", // 图表标题
                           "水果", // 目录轴的显示标签
                           "产量", // 数值轴的显示标签
                            dataset, // 数据集
                            PlotOrientation.VERTICAL, // 图表方向:水平、垂直
                            true,  // 是否显示图例(对于简单的柱状图必须是 false)
                            false, // 是否生成工具
                            false  // 是否生成 URL 链接
                            ); 
        
        chart.setBackgroundPaint(Color.WHITE); 
        CategoryPlot plot = chart.getCategoryPlot(); 
        CategoryAxis domainAxis = plot.getDomainAxis(); 
        domainAxis.setAxisLineVisible(false); 
        NumberAxis numberaxis = (NumberAxis) plot.getRangeAxis();
        TextTitle textTitle = chart.getTitle();
        textTitle.setFont(new Font("黑体", Font.PLAIN, 20));
        domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));
        domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
        numberaxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));
        numberaxis.setLabelFont(new Font("黑体", Font.PLAIN, 12));
        chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));
        plot.setDomainAxis(domainAxis); 
        BarRenderer3D renderer = new BarRenderer3D(); 
        renderer.setBaseOutlinePaint(Color.BLACK);
        // 显示每个柱的数值,并修改该数值的字体属性 
        renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); 
        // 设置每个地区所包含的平行柱的之间距离 
        renderer.setItemMargin(0.1); 
        // 设置柱的数值可见
        renderer.setBaseItemLabelsVisible(true);
        plot.setRenderer(renderer); 
        // 设置柱的透明度 
        plot.setForegroundAlpha(0.8f); 
                            
        FileOutputStream fos_jpg = null; 
        try { 
            fos_jpg = new FileOutputStream("D:\\fruitt.jpg"); 
            ChartUtilities.writeChartAsJPEG(fos_jpg, 1, chart, 400, 300); 
        } finally { 
            try { 
                fos_jpg.close(); 
            } catch (Exception e) {} 
        } 
    }  
    /** 
    * 获取一个演示用的组合数据集对象
    * @return 
    */ 
    private 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; 
    } 
}

效果图片:
这里写图片描述

3.链接数据库,获得数据库中的数据,生成图片通过jsp显示到浏览器

这里利用的servlet来实现,利用jsp也可以实现,但是jsp处理业务逻辑不方便。
其实很简单,在servlet中实现一个方法取代上面代码中的getDataSet2()方法,不同的是数据不是自己直接添加的,而是与数据库连接,通过数据库得到的。下面是代码:
(注意:下面的DBUtil类是一个工具类,功能只是得到一个已经获取数据库连接的Connection对象)

private static CategoryDataset getDataSet() { 
	     //数据集   
		 DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 
	     //从数据库中获取数据
		 Connection conn=null;
		 PreparedStatement ptmt=null;
		 ResultSet rs=null;
		 String sql="";
		 
		 try {
			conn=DBUtil.getConnection();
			sql="SELECT goodsName,sum(trading_Number)FROM trading AS t JOIN goods AS g ON(goodsId=trading_GoodsId) GROUP BY goodsId ";
			ptmt=conn.prepareStatement(sql);
			rs=ptmt.executeQuery();
			while(rs.next()){
				dataset.addValue(rs.getInt(2), "", rs.getString(1));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				ptmt.close();
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		 return dataset;
		 
	    } 

获得数据以后,制表就和第2点中的方法一样了,你可以改变表名,字体等相关信息。
表制作成功以后保存到项目下,方便jsp页面可以直接用img标签读取,代码略。
这里写图片描述

4.制作一张饼状图保存在电脑上

饼图代码,很多代码设置了一些不必要的东西,个人觉得这个代码就比较简洁了,如有问题,欢迎指正!

import java.awt.BasicStroke;
import java.awt.Color;
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.plot.PiePlot3D;  
import org.jfree.data.general.DefaultPieDataset;  
import org.jfree.util.Rotation;  
  
public class Test2 {   
	
	public static void main(String[] args) throws IOException{
		//获得数据集
		DefaultPieDataset df=Test2.getDataSet2();
		//创建3D饼图  
        JFreeChart chart = ChartFactory.createPieChart3D("某驯养场动物数量",df, true, true, false);
        //设置图片背景色  
        chart.setBackgroundPaint(Color.white);
        //取得3D饼图对象  
        PiePlot3D plot = (PiePlot3D) chart.getPlot();  
        //指定显示的饼图上圆形(false)还椭圆形(true)  
        plot.setCircular(false); 
        //设置图形边框颜色  
        //plot.setBaseSectionOutlinePaint(Color.red);   
        // 图形边框粗细  
        plot.setBaseSectionOutlineStroke(new BasicStroke(0.7f));
        //设置旋转角度  
        plot.setStartAngle(290);
        //设置旋转方向  
        plot.setDirection(Rotation.CLOCKWISE);  
        //设置透明度  
        plot.setForegroundAlpha(0.9f);
        //设置标题字体 
        chart.getTitle().setFont(new Font("宋体",Font.BOLD,25));
        chart.getLegend().setItemFont(new Font("黑体",Font.BOLD,20));
        plot.setLabelFont((new Font("宋体", Font.PLAIN, 20))); 
        
        
        
        FileOutputStream fos_jpg = null; 
        try { 
            fos_jpg = new FileOutputStream("D:\\pig.jpg"); 
            ChartUtilities.writeChartAsJPEG(fos_jpg, 1, chart, 400, 300);
            //ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,400,300,null); 
        } finally { 
            try { 
                fos_jpg.close(); 
            } catch (Exception e) {} 
        }
	}
	
    private static DefaultPieDataset getDataSet2() { 
    	DefaultPieDataset df=new DefaultPieDataset();
    	df.setValue("牛", 2);
    	df.setValue("猪", 20);
    	df.setValue("羊", 45);
    	df.setValue("马", 10);
    	df.setValue("兔", 9);
    	df.setValue("鸡", 12);
		
    	return df;
    }      
}

效果图
这里写图片描述

连接数据库,通过jsp页面展示图片和上述第3点方法一致

5.简单总结

  • 制作柱状图

  • 获得数据: CategoryDataset dataset = getDataSet();

  • 对应的工厂方法为 createBarChart3D,JFreeChart chart = ChartFactory.createBarChart3D...

  • 制作饼状图

  • 获得数据:DefaultPieDataset df=Test2.getDataSet();

  • 对应的工厂方法为 createPieChart3D,JFreeChart chart=ChartFactory.createPieChart3D...

  • 获取图片都是用的javaIO流

FileOutputStream fos_jpg = null; 
    try { 
         fos_jpg = new FileOutputStream("D:\\pig.jpg"); 
         ChartUtilities.writeChartAsJPEG(fos_jpg, 1, chart, 400, 300);
         //ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,400,300,null); 
    } finally { 
         try { 
	         fos_jpg.close(); 
         }catch (Exception e) {} 
     }
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值