JFreeChart主要用來各種各樣的圖表,這些圖表包括:餅圖、柱狀圖(普通柱狀圖以及堆棧柱狀圖)、線圖、區域圖、分布圖、混合圖、甘特圖以及一些儀表盤等等
(源代碼下載)
示例程序運用的jar包:
- jcommon-1.0.17.jar
- jfreechart-1.0.14.jar
1:普通柱狀圖
這是程序調用CategoryDataset dataset = getDataSet2(); 后所生產的圖片
BarChartDemo.java柱狀圖代碼
/** * 該類用於演示最簡單的柱狀圖生成 * @author Winter Lau */ public class BarChartDemo { public static void main(String[] args) throws IOException{ CategoryDataset dataset = getDataSet2(); JFreeChart chart = ChartFactory.createBarChart3D( "水果產量圖", // 圖表標題 "水果", // 目錄軸的顯示標簽 "產量", // 數值軸的顯示標簽 dataset, // 數據集 PlotOrientation.VERTICAL, // 圖表方向:水平、垂直 true, // 是否顯示圖例(對於簡單的柱狀圖必須是 false) false, // 是否生成工具 false // 是否生成 URL 鏈接 ); //中文亂碼 CategoryPlot categoryplot = (CategoryPlot) chart.getPlot(); NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis(); CategoryAxis domainAxis = categoryplot.getDomainAxis(); 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)); FileOutputStream fos_jpg = null; try { fos_jpg = new FileOutputStream("D:\\BarChart.jpg"); ChartUtilities.writeChartAsJPEG(fos_jpg, 1.0f,chart,400,300,null); } finally { try { fos_jpg.close(); } catch (Exception e) {} } } /** * 獲取一個演示用的簡單數據集對象 * @return */ private static CategoryDataset getDataSet() { DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(100, "", "蘋果"); dataset.addValue(200, "", "梨子"); dataset.addValue(300, "", "葡萄"); dataset.addValue(400, "", "香蕉"); dataset.addValue(500, "", "荔枝"); return dataset; } /** * 獲取一個演示用的組合數據集對象 * @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; } }
2:餅狀圖
PieChartDemo.java餅狀圖源代碼
/** * 用於演示餅圖的生成 */ public class PieChartDemo { public static void main(String[] args) throws IOException { DefaultPieDataset data = getDataSet(); JFreeChart chart = ChartFactory.createPieChart3D("水果產量圖", // 圖表標題 data, // 數據集 true, // 是否顯示圖例(對於簡單的柱狀圖必須是 false) false, // 是否生成工具 false // 是否生成 URL 鏈接 ); //中文亂碼 PiePlot3D plot = (PiePlot3D) chart.getPlot(); plot.setLabelFont(new Font("黑體", Font.PLAIN, 20)); TextTitle textTitle = chart.getTitle(); textTitle.setFont(new Font("黑體", Font.PLAIN, 20)); chart.getLegend().setItemFont(new Font("宋體", Font.PLAIN, 12)); // 寫圖表對象到文件,參照柱狀圖生成源碼 FileOutputStream fos_jpg = null; try { fos_jpg = new FileOutputStream("D:\\Pie3DChart.jpg"); ChartUtilities.writeChartAsJPEG(fos_jpg, 1.0f, chart, 400, 300, null); } finally { try { fos_jpg.close(); } catch (Exception e) { } } } /** * 獲取一個演示用的簡單數據集對象 * * @return */ private static DefaultPieDataset getDataSet() { DefaultPieDataset dataset = new DefaultPieDataset(); dataset.setValue("蘋果", 100); dataset.setValue("梨子", 200); dataset.setValue("葡萄", 300); dataset.setValue("香蕉", 400); dataset.setValue("荔枝", 500); return dataset; } }
其他的圖表類型暫時不寫了,其實寫法也差不多。這里注意兩種圖形的中文亂碼解決方法是不一樣的,具體查看源代碼中的紅色部分
3:將數據庫的內容用圖形表示出來
index.jsp
<body> <form action="servlet/ShowChartServlet" method="get" > <input type="submit" value="jfreechart訪問數據庫生成圖表"> </form> </body>
showJfreeChart.jsp
<body> <center> <img alt="" src="<%=path %>/reports/productSales.jpg"> </center> </body>
ShowChartServlet.java
public class ShowChartServlet extends HttpServlet { /** * 獲取一個演示用的組合數據集對象 * * @return */ private static CategoryDataset getDataSet() { DefaultCategoryDataset dataset = new DefaultCategoryDataset(); // 從數據庫中獲取 Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver"); // 加載驅動程序 conn = DriverManager .getConnection( "jdbc:mysql://localhost:3306/shopping?useUnicode=true&characterEncoding=utf8", "root", "root"); ps = conn.prepareStatement("select p.name, count(pcount) from product p join salesitem si on (p.id = si.productid) group by p.id"); rs = ps.executeQuery(); while (rs.next()) { dataset.addValue(rs.getInt(2), "", rs.getString(1)); } rs.close(); rs = null; } catch (SQLException e) { e.printStackTrace(); }catch (ClassNotFoundException e) { e.printStackTrace(); } finally { if(ps != null){ try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } return dataset; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { CategoryDataset dataset = getDataSet(); JFreeChart chart = ChartFactory.createBarChart3D( "產品銷量圖", // 圖表標題 "產品", // 目錄軸的顯示標簽 "銷量", // 數值軸的顯示標簽 dataset, // 數據集 PlotOrientation.VERTICAL, // 圖表方向:水平、垂直 true, // 是否顯示圖例(對於簡單的柱狀圖必須是 false) false, // 是否生成工具 false // 是否生成 URL 鏈接 ); //中文亂碼 CategoryPlot categoryplot = (CategoryPlot) chart.getPlot(); NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis(); CategoryAxis domainAxis = categoryplot.getDomainAxis(); 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)); FileOutputStream fos_jpg = null; try { fos_jpg = new FileOutputStream("E:\\Workspaces\\MyEclipse 9\\WebProjects\\JFreeChart\\WebRoot\\reports\\productSales.jpg"); ChartUtilities.writeChartAsJPEG(fos_jpg, 1.0f,chart,400,300,null); String path = this.getServletContext().getContextPath(); System.out.println(path+"mmmmmmmmmmm"); this.getServletContext().getRequestDispatcher("/showJfreeChart.jsp").forward(request, response); } finally { try { fos_jpg.close(); } catch (Exception e) {} } } }