JFreeChart主要用来各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等

(源代码下载)

示例程序运用的jar包:

  • jcommon-1.0.17.jar
  • jfreechart-1.0.14.jar

1:普通柱状图

这是程序调用CategoryDataset dataset = getDataSet2(); 后所生产的图片

BarChartDemo.java柱状图代码

  1. /**
  2. * 该类用于演示最简单的柱状图生成
  3. * @author Winter Lau
  4. */
  5. public class BarChartDemo {
  6. public static void main(String[] args) throws IOException{
  7.  
  8. CategoryDataset dataset = getDataSet2();
  9. JFreeChart chart = ChartFactory.createBarChart3D(
  10. "水果产量图", // 图表标题
  11. "水果", // 目录轴的显示标签
  12. "产量", // 数值轴的显示标签
  13. dataset, // 数据集
  14. PlotOrientation.VERTICAL, // 图表方向:水平、垂直
  15. true, // 是否显示图例(对于简单的柱状图必须是 false)
  16. false, // 是否生成工具
  17. false // 是否生成 URL 链接
  18. );
  19. //中文乱码
  20. CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
  21. NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
  22. CategoryAxis domainAxis = categoryplot.getDomainAxis();
  23. TextTitle textTitle = chart.getTitle();
  24. textTitle.setFont(new Font("黑体", Font.PLAIN, 20));
  25. domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));
  26. domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
  27. numberaxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));
  28. numberaxis.setLabelFont(new Font("黑体", Font.PLAIN, 12));
  29. chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));
  30.  
  31. FileOutputStream fos_jpg = null;
  32. try {
  33. fos_jpg = new FileOutputStream("D:\\BarChart.jpg");
  34. ChartUtilities.writeChartAsJPEG(fos_jpg, 1.0f,chart,400,300,null);
  35. } finally {
  36. try {
  37. fos_jpg.close();
  38. } catch (Exception e) {}
  39. }
  40. }
  41. /**
  42. * 获取一个演示用的简单数据集对象
  43. * @return
  44. */
  45. private static CategoryDataset getDataSet() {
  46. DefaultCategoryDataset dataset = new DefaultCategoryDataset();
  47. dataset.addValue(100, "", "苹果");
  48. dataset.addValue(200, "", "梨子");
  49. dataset.addValue(300, "", "葡萄");
  50. dataset.addValue(400, "", "香蕉");
  51. dataset.addValue(500, "", "荔枝");
  52. return dataset;
  53. }
  54. /**
  55. * 获取一个演示用的组合数据集对象
  56. * @return
  57. */
  58. private static CategoryDataset getDataSet2() {
  59. DefaultCategoryDataset dataset = new DefaultCategoryDataset();
  60. dataset.addValue(100, "北京", "苹果");
  61. dataset.addValue(100, "上海", "苹果");
  62. dataset.addValue(100, "广州", "苹果");
  63. dataset.addValue(200, "北京", "梨子");
  64. dataset.addValue(200, "上海", "梨子");
  65. dataset.addValue(200, "广州", "梨子");
  66. dataset.addValue(300, "北京", "葡萄");
  67. dataset.addValue(300, "上海", "葡萄");
  68. dataset.addValue(300, "广州", "葡萄");
  69. dataset.addValue(400, "北京", "香蕉");
  70. dataset.addValue(400, "上海", "香蕉");
  71. dataset.addValue(400, "广州", "香蕉");
  72. dataset.addValue(500, "北京", "荔枝");
  73. dataset.addValue(500, "上海", "荔枝");
  74. dataset.addValue(500, "广州", "荔枝");
  75. return dataset;
  76. }
  77. }

2:饼状图

PieChartDemo.java饼状图源代码

  1. /**
  2. * 用于演示饼图的生成
  3. */
  4. public class PieChartDemo {
  5. public static void main(String[] args) throws IOException {
  6. DefaultPieDataset data = getDataSet();
  7. JFreeChart chart = ChartFactory.createPieChart3D("水果产量图", // 图表标题
  8. data, // 数据集
  9. true, // 是否显示图例(对于简单的柱状图必须是 false)
  10. false, // 是否生成工具
  11. false // 是否生成 URL 链接
  12. );
  13.  
  14. //中文乱码
  15. PiePlot3D plot = (PiePlot3D) chart.getPlot();
  16. plot.setLabelFont(new Font("黑体", Font.PLAIN, 20));
  17. TextTitle textTitle = chart.getTitle();
  18. textTitle.setFont(new Font("黑体", Font.PLAIN, 20));
  19. chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));
  20.  
  21. // 写图表对象到文件,参照柱状图生成源码
  22. FileOutputStream fos_jpg = null;
  23. try {
  24. fos_jpg = new FileOutputStream("D:\\Pie3DChart.jpg");
  25. ChartUtilities.writeChartAsJPEG(fos_jpg, 1.0f, chart, 400, 300,
  26. null);
  27. } finally {
  28. try {
  29. fos_jpg.close();
  30. } catch (Exception e) {
  31. }
  32. }
  33. }
  34.  
  35. /**
  36. * 获取一个演示用的简单数据集对象
  37. *
  38. * @return
  39. */
  40. private static DefaultPieDataset getDataSet() {
  41. DefaultPieDataset dataset = new DefaultPieDataset();
  42. dataset.setValue("苹果", 100);
  43. dataset.setValue("梨子", 200);
  44. dataset.setValue("葡萄", 300);
  45. dataset.setValue("香蕉", 400);
  46. dataset.setValue("荔枝", 500);
  47. return dataset;
  48. }
  49. }

其他的图表类型暂时不写了,其实写法也差不多。这里注意两种图形的中文乱码解决方法是不一样的,具体查看源代码中的红色部分

3:将数据库的内容用图形表示出来

index.jsp

  1. <body>
  2. <form action="servlet/ShowChartServlet" method="get" >
  3. <input type="submit" value="jfreechart访问数据库生成图表">
  4. </form>
  5. </body>

showJfreeChart.jsp

  1. <body>
  2. <center>
  3. <img alt="" src="<%=path %>/reports/productSales.jpg">
  4. </center>
  5. </body>

ShowChartServlet.java

  1. public class ShowChartServlet extends HttpServlet {
  2.  
  3. /**
  4. * 获取一个演示用的组合数据集对象
  5. *
  6. * @return
  7. */
  8. private static CategoryDataset getDataSet() {
  9. DefaultCategoryDataset dataset = new DefaultCategoryDataset();
  10. // 从数据库中获取
  11. Connection conn = null;
  12. PreparedStatement ps = null;
  13. ResultSet rs = null;
  14. try {
  15. Class.forName("com.mysql.jdbc.Driver"); // 加载驱动程序
  16. conn = DriverManager
  17. .getConnection(
  18. "jdbc:mysql://localhost:3306/shopping?useUnicode=true&amp;characterEncoding=utf8",
  19. "root", "root");
  20. ps = conn.prepareStatement("select p.name, count(pcount) from product p join salesitem si on (p.id = si.productid) group by p.id");
  21. rs = ps.executeQuery();
  22. while (rs.next()) {
  23. dataset.addValue(rs.getInt(2), "", rs.getString(1));
  24. }
  25. rs.close();
  26. rs = null;
  27. } catch (SQLException e) {
  28. e.printStackTrace();
  29. }catch (ClassNotFoundException e) {
  30. e.printStackTrace();
  31. }
  32. finally {
  33. if(ps != null){
  34. try {
  35. ps.close();
  36. } catch (SQLException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. if(conn != null){
  41. try {
  42. conn.close();
  43. } catch (SQLException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47.  
  48. }
  49.  
  50. return dataset;
  51. }
  52.  
  53. public void doGet(HttpServletRequest request, HttpServletResponse response)
  54. throws ServletException, IOException {
  55.  
  56. CategoryDataset dataset = getDataSet();
  57. JFreeChart chart = ChartFactory.createBarChart3D(
  58. "产品销量图", // 图表标题
  59. "产品", // 目录轴的显示标签
  60. "销量", // 数值轴的显示标签
  61. dataset, // 数据集
  62. PlotOrientation.VERTICAL, // 图表方向:水平、垂直
  63. true, // 是否显示图例(对于简单的柱状图必须是 false)
  64. false, // 是否生成工具
  65. false // 是否生成 URL 链接
  66. );
  67. //中文乱码
  68. CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
  69. NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
  70. CategoryAxis domainAxis = categoryplot.getDomainAxis();
  71. TextTitle textTitle = chart.getTitle();
  72. textTitle.setFont(new Font("黑体", Font.PLAIN, 20));
  73. domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));
  74. domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
  75. numberaxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));
  76. numberaxis.setLabelFont(new Font("黑体", Font.PLAIN, 12));
  77. chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));
  78.  
  79. FileOutputStream fos_jpg = null;
  80. try {
  81. fos_jpg = new FileOutputStream("E:\\Workspaces\\MyEclipse 9\\WebProjects\\JFreeChart\\WebRoot\\reports\\productSales.jpg");
  82. ChartUtilities.writeChartAsJPEG(fos_jpg, 1.0f,chart,400,300,null);
  83. String path = this.getServletContext().getContextPath();
  84. System.out.println(path+"mmmmmmmmmmm");
  85. this.getServletContext().getRequestDispatcher("/showJfreeChart.jsp").forward(request, response);
  86. } finally {
  87. try {
  88. fos_jpg.close();
  89. } catch (Exception e) {}
  90. }
  91. }
  92.  
  93. }

JreeeChart入门的更多相关文章

  1. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  3. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  4. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  5. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  6. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

  7. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  8. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  9. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

随机推荐

  1. [PCL]FPFH描述子

    fpfh_est.setSearchSurface(data); 如果没有设置SearchSurface,使用input数据集作为查找的表面 // If no search surface has b ...

  2. mysql中int、bigint、smallint 和 tinyint的区别

    使用整数数据的精确数字数据类型. bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字).存储 ...

  3. [Android Tips] 13. How to Detect Tablet

    /** * 判断是否是平板 * @param context * @return */ public static boolean isTablet(Context context) { return ...

  4. oracle重建控制文件

    根据已有数据库创建新的控制文件#数据库必须是mounted或open状态 sql> alter database backup controlfile to trace; 可以使用以下快捷方式找 ...

  5. 对hashmap与hashcode()、equals()的理解

    1.equals方法没被重写的时候   比较的只是对象的地址  重写之后 比较的才是对象里的内容 2.重写equals的时候 务必需要重写hashcode 不然在用到容器的时候 会出现问题 因为容器会 ...

  6. C# TreeView的CheckBox 父/子节点点击联动选择效果

    注: 点击时请正常速度点击,不然会出现“奇怪”现象!!! /// <summary> /// 节点点击 子级->同级->父级 /// </summary> /// ...

  7. 【数论】二进制GCD

    二进制GCD     GCD这种通用的算法相信每个OLER都会 ,辗转相除,代码只有四行 : int GCD(int a,int b){ if(b==0) return a; return GCD(b ...

  8. ReentrantReadWriteLock类和ReentrantLock类的区别

    Java.util.concurrent.locks包定义了两个锁类,ReentrantLock和ReentrantReadWriteLock类. 当有很多线程都从某个数据结构中读取数据而很少有线程对 ...

  9. 论Postgres的“已提交的而且 xmin’比当前事务的XID小的记录对当前事务才是可见的”

    最近在网上看到这样一句话Postgres“已提交的而且 xmin 比当前事务的XID小的记录对当前事务才是可见的”.先不评断这句话的正确性:看下这句话的结构,因果关系: 按照此话的意思:要postgr ...

  10. objective C 学习之02

    1. 函数 -(void) HelloWorld:(BOOL)ishelloworld{ //干点啥 } 前面带有减号(-) 的方法为实例方法,必须使用类的实例才可以调用的.对应的有+号, 代表是类的 ...