一:JFreeChart功能介紹
JFreeChart 目前是最好的java圖形解決方案,基本能夠解決目前的圖形方面的需求,主要包括如下幾個方面:
pie charts (2D and 3D) :餅圖(平面和立體)
bar charts (regular and stacked, with an optional 3D effect) :柱狀圖
line and area charts :曲線圖
scatter plots and bubble charts
time series, high/low/open/close charts and candle stick charts :時序圖
combination charts :復合圖
Pareto charts
Gantt charts :甘特圖
wind plots, meter charts and symbol charts
wafer map charts
( 態圖表,餅圖(二維和三維) , 柱狀圖 ( 水平,垂直),線圖,點圖,時間變化圖,甘特圖, 股票行情圖,混和圖, 溫度計圖, 刻度圖等常用商用圖表)
圖形可以導出成PNG和JPEG格式,同時還可以與PDF和EXCEL關聯
JFreeChart 核心類庫介紹:
研究jfreechart源碼發現源碼的主要由兩個大的包組成:org.jfree.chart,org.jfree.data。其中前者主要與圖形
本身有關,后者與圖形顯示的數據有關。具體研究如果大家有興趣的話可以自己研究 。
核心類主要有:
org.jfree.chart.JFreeChart :圖表對象,任何類型的圖表的最終表現形式都是在該對象進行一些屬性的定制。JFreeChart引擎本身提供了一個工廠類用于創建不同類型的圖表對象
org.jfree.data.category.XXXDataSet: 數據集對象,用于提供顯示圖表所用的數據。根據不同類型的圖表對應著很多類型的數據集對象類
org.jfree.chart.plot.XXXPlot :圖表區域對象,基本上這個對象決定著什么樣式的圖表,創建該對象的時候需要Axis、Renderer以及數據集對象的支持
org.jfree.chart.axis.XXXAxis :用于處理圖表的兩個軸:縱軸和橫軸
org.jfree.chart.render.XXXRender :負責如何顯示一個圖表對象
org.jfree.chart.urls.XXXURLGenerator: 用于生成Web圖表中每個項目的鼠標點擊鏈接
XXXXXToolTipGenerator: 用于生成圖象的幫助提示,不同類型圖表對應不同類型的工具提示類
個人感覺JFreeChart可以滿足大部分圖片創建的需要,美中不足的是:對字體的設置做的不夠好,特別是使用中文的時候字體很不清晰。因為這個原因建議你自己去修改他的源代碼,最好使用properties文件去設置字體.還有就是文檔要錢所以要多花點時間去看源代碼。或多上社區.
以下是一個簡單的Jfreechart Web項目:
web.xml:
viewChart.jsp 用于顯示圖
后臺處理類:
JFreeChart 目前是最好的java圖形解決方案,基本能夠解決目前的圖形方面的需求,主要包括如下幾個方面:
pie charts (2D and 3D) :餅圖(平面和立體)
bar charts (regular and stacked, with an optional 3D effect) :柱狀圖
line and area charts :曲線圖
scatter plots and bubble charts
time series, high/low/open/close charts and candle stick charts :時序圖
combination charts :復合圖
Pareto charts
Gantt charts :甘特圖
wind plots, meter charts and symbol charts
wafer map charts
( 態圖表,餅圖(二維和三維) , 柱狀圖 ( 水平,垂直),線圖,點圖,時間變化圖,甘特圖, 股票行情圖,混和圖, 溫度計圖, 刻度圖等常用商用圖表)
圖形可以導出成PNG和JPEG格式,同時還可以與PDF和EXCEL關聯
JFreeChart 核心類庫介紹:
研究jfreechart源碼發現源碼的主要由兩個大的包組成:org.jfree.chart,org.jfree.data。其中前者主要與圖形
本身有關,后者與圖形顯示的數據有關。具體研究如果大家有興趣的話可以自己研究 。
核心類主要有:
org.jfree.chart.JFreeChart :圖表對象,任何類型的圖表的最終表現形式都是在該對象進行一些屬性的定制。JFreeChart引擎本身提供了一個工廠類用于創建不同類型的圖表對象
org.jfree.data.category.XXXDataSet: 數據集對象,用于提供顯示圖表所用的數據。根據不同類型的圖表對應著很多類型的數據集對象類
org.jfree.chart.plot.XXXPlot :圖表區域對象,基本上這個對象決定著什么樣式的圖表,創建該對象的時候需要Axis、Renderer以及數據集對象的支持
org.jfree.chart.axis.XXXAxis :用于處理圖表的兩個軸:縱軸和橫軸
org.jfree.chart.render.XXXRender :負責如何顯示一個圖表對象
org.jfree.chart.urls.XXXURLGenerator: 用于生成Web圖表中每個項目的鼠標點擊鏈接
XXXXXToolTipGenerator: 用于生成圖象的幫助提示,不同類型圖表對應不同類型的工具提示類
個人感覺JFreeChart可以滿足大部分圖片創建的需要,美中不足的是:對字體的設置做的不夠好,特別是使用中文的時候字體很不清晰。因為這個原因建議你自己去修改他的源代碼,最好使用properties文件去設置字體.還有就是文檔要錢所以要多花點時間去看源代碼。或多上社區.
以下是一個簡單的Jfreechart Web項目:
web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- for test jfreechar --> <servlet> <servlet-name>ChartServlet</servlet-name> <servlet-class>cn.netjava.jFreeChart.ChartServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ChartServlet</servlet-name> <url-pattern>/servlet/ChartServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>viewChart.jsp</welcome-file> </welcome-file-list> </web-app>
viewChart.jsp 用于顯示圖
<%@page contentType="text/html" pageEncoding="GBK"%> <title>jFreeChart圖表測試</title> <br>請選擇要生成的圖表類型: <hr> <select id="scType" onchange="loadChartBySelectType(this)"> <option value="1">請選擇一種圖表</option> <option value="PieChart3D">PieChart3D</option> <option value="PieChart">PieChart</option> <option value="BarChart3D">BarChart3D</option> <option value="LineChart">LineChart</option> <option value="RingChart">RingChart</option> <option value="AreaChart">AreaChart</option> <option value="WaterfallChart">WaterfallChart</option> <option value="Thermometer">Thermometer</option> <option value="MeterChart">MeterChart</option> </select> <hr> 圖表: <div id="displayChart" /> <script type="text/javascript"> /**選擇jf圖表類型時,載入圖片*/ function loadChartBySelectType(sua) { var cType=sua.value; if(cType=="1"){ return ; } alert("選中的是: "+cType) var disabledImageZone=document.getElementById("displayChart"); //這樣多簡單,清理div中己有的東東:) disabledImageZone.innerHTML=""; var image = document.createElement('img'); image.setAttribute('id','imageZone'); //提取服務器上的圖片顯示下來: image.setAttribute('src',"servlet/ChartServlet?chartType="+cType); disabledImageZone.appendChild(image); } </script>
后臺處理類:
package cn.netjava.jFreeChart; import java.awt.BasicStroke; import java.awt.Color; import java.io.IOException; import javax.servlet.*; import javax.servlet.http.*; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.MeterPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.ThermometerPlot; import org.jfree.data.Range; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.data.general.DefaultPieDataset; import org.jfree.data.general.DefaultValueDataset; /** * 生成jFreeChart圖片的Servlet * @author Eric.zhangh * Jan 8, 2011 */ public class ChartServlet extends HttpServlet { /** * 根據客戶端請求的圖表類型chartType的值,返回對應的圖表, */ public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 輸出圖片格式為png格式 response.setHeader("Cache-Control", "no-cache"); response.setContentType("image/png"); //請求的圖表類型 String chartType = request.getParameter("chartType"); System.out.println("請求的圖表類型是 : " + chartType); // for export Chart: JFreeChart chart = null; if (chartType.equalsIgnoreCase("PieChart3D")) { // 創建pie圖的數據集方法 DefaultPieDataset data = ChartTools.getPieDataSet(); chart = ChartFactory.createPieChart3D("這是PieChart3D圖:", data, true, false, false); } else if (chartType.equalsIgnoreCase("PieChart")) { // 創建pie圖的數據集方法 DefaultPieDataset data = ChartTools.getPieDataSet(); chart = ChartFactory.createPieChart("這是PieChart圖:", data, true, false, false); } else if (chartType.equalsIgnoreCase("RingChart")) { // 創建pie圖的數據集方法 DefaultPieDataset data = ChartTools.getPieDataSet(); chart = ChartFactory.createRingChart("這是RingChart圖:", data, true, false, false); } else if (chartType.equalsIgnoreCase("BarChart3D")) { // 創建bar圖的數據集方法 DefaultCategoryDataset data = ChartTools.getCategoryDataset(); // PlotOrientation.HORIZONTAL這個參數說明是水平還是垂直方向VERTICAL chart = ChartFactory.createBarChart3D("這是BarChart3D", "數量", "地點", data, PlotOrientation.VERTICAL, true, false, false); } else if (chartType.equalsIgnoreCase("LineChart")) { // 創建線圖 DefaultCategoryDataset data = ChartTools.getCategoryDataset(); chart = ChartFactory.createLineChart("這是LineChart", "數量", "地點", data, PlotOrientation.VERTICAL, true, false, false); } else if (chartType.equalsIgnoreCase("AreaChart")) { // 創建區域形圖 DefaultCategoryDataset data = ChartTools.getCategoryDataset(); chart = ChartFactory.createAreaChart("這是AreaChart", "數量", "地點", data, PlotOrientation.VERTICAL, true, false, false); } else if (chartType.equalsIgnoreCase("WaterfallChart")) { // 搞不明白這是什么圖:( DefaultCategoryDataset data = ChartTools.getCategoryDataset(); chart = ChartFactory.createWaterfallChart("這是WaterfallChart", "數量", "地點", data, PlotOrientation.VERTICAL, true, false, false); } else if (chartType.equalsIgnoreCase("Thermometer")) { // 整個溫度計。。。。。。。。。。 // 數據集,初始值為0 DefaultValueDataset valuedataset = new DefaultValueDataset(0); // 創建漫度計的Plot對象 ThermometerPlot thermometerplot = new ThermometerPlot(valuedataset); chart = new JFreeChart("設備溫度", JFreeChart.DEFAULT_TITLE_FONT, thermometerplot, false); thermometerplot.setThermometerStroke(new BasicStroke(2.0F)); // 圖表的輪廓顏色 thermometerplot.setThermometerPaint(Color.BLUE); thermometerplot.setOutlinePaint(null); // 圖表計數單位 thermometerplot.setUnits(10); // 數值范圍 thermometerplot.setRange(-40, 40); thermometerplot.setForegroundAlpha(1f); // 圖表的當前值 valuedataset.setValue(20); } else if (chartType.equalsIgnoreCase("MeterChart")) { // 整個儀表盤 // 數據集,初始值為30 DefaultValueDataset valuedataset = new DefaultValueDataset(30); // 創建Plot對象 MeterPlot meterplot = new MeterPlot(valuedataset); chart = new JFreeChart("當前流量速度", JFreeChart.DEFAULT_TITLE_FONT, meterplot, false); // 表盤上顯示的數據單位說明 meterplot.setUnits("條/秒)"); // 表盤分害的單位,即30為一格 meterplot.setTickSize(30); // 顯示數據范圍,0~600 meterplot.setRange(new Range(0, 600)); // 圖表的當前值 valuedataset.setValue(100); } if (null != chart) { // 將圖片對象輸出到客戶端 java.io.OutputStream ous = response.getOutputStream(); ChartUtilities.writeChartAsPNG(ous, chart, 500, 300); // 使用這樣的代碼輸出可能會出錯! // ChartUtilities.writeChartAsJPEG(ous,100,chart,500,300,null); ous.flush(); ous.close(); System.out.println("******ho ho..*****圖片輸出完畢....... " + chartType); } } } /** * 生成圖片數據集的工具類: * @author Eric.zhangh * Jan 8, 2011 */ class ChartTools { /** * 生成bar圖的數據集: * @return:可用于Bar圖的數據集 */ public static DefaultCategoryDataset getCategoryDataset() { DefaultCategoryDataset dataset = new DefaultCategoryDataset(); for (int series = 0; series < seriesTimes.length; series++) { for (int i = 0; i < seriesNames.length; i++) { nameValueOfTime[series][i] = new java.util.Random() .nextInt(300) + 100; dataset.addValue(nameValueOfTime[series][i], seriesNames[i], seriesTimes[series]); } } return dataset; } /** * 創建用于填充pie圖的數據集 * @return DefaultPieDataset對象 */ public static DefaultPieDataset getPieDataSet() { // 用來填充pie圖的數據集 DefaultPieDataset dataset = new DefaultPieDataset(); // 餅圖分塊名字 String[] seriesNames = { "東方路", "南京路", "北京路", "大學路", }; for (int i = 0; i < seriesNames.length; i++) { int value = new java.util.Random().nextInt(1000) + 500; // 設置pie數據集中的數據對 dataset.setValue(seriesNames[i], value); } return dataset; } private ChartTools(){}; /** X軸時間維數據序型(當然也可以為標簽維度)* */ private static String[] seriesTimes = { "一月", "二月", "三月", "四月", "五月", "六月","七月" }; /** 柱狀標簽序列(比如做為地點序列) */ private static String[] seriesNames = { "南京東路", "北京東路", "浦東南路" }; /** 每個時間點上每個地區/類型序列的值 */ private static int[][] nameValueOfTime = new int[seriesTimes.length][seriesNames.length]; }









更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
