jfreechart 實現時間曲線圖

jopen 10年前發布 | 22K 次閱讀 JFreeChart 圖表/報表制作

jfreechart 實現時間曲線圖


一、JFreeChart獲取。


JFreeChart是JFreeChart公司在開源網站SourceForge.net上的一個項目,該公司的主要產品有如下:


1、JFreeReport:報表解決工具 
2、JFreeChart:Java圖形解決方案(Application/Applet/Servlet/Jsp) 
3、JCommon:JFreeReport和JFreeChart的公共類庫 
4、JFreeDesigner:JFreeReport的報表設計工具 

我們可以從jfree官方網站上獲取最新版本和相關資料(但是jfree的document需要40美金才能獲取),下載地址:http://www.jfree.org/jfreechart/index.html(同時可以獲得簡明介紹) 
我們以當前最新版本:jfreechart_0.9.21.zip為例子進行說明。 

二、JFreeChart配置安裝


1、解壓jfreechart_0.9.21.zip到指定位置,其中source是jfreechart的源碼,jfreechart-0.9.21-demo.jar 是例子程序(該部分留給大家自己去研究)

2、為了配置成功,我們需要關注的文件有如下三個:jfreechart-0.9.21.jar、lib\jcommon-0.9.6.jar、lib\gnujaxp.jar。


3、如果是Application開發,把上述三個文件拷貝到%JAVA_HOME%\LIB中,同時在環境變量CLASSPATH中加入,如果是WEB開發,以TOMCAT中的一個WEB項目TEST為例子說明。


把上述三個文件拷貝到TEST\WEB-INF\LIB中,然后修改TEST\WEB-INF\web.xml文件,在其中加入如下代碼:

<servlet> 
<servlet-name>DisplayChart</servlet-name> 
<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class> 
</servlet> 
<servlet-mapping> 
<servlet-name>DisplayChart</servlet-name> 
<url-pattern>/servlet/DisplayChart</url-pattern> 
</servlet-mapping>

 
至此jfreechart的配置就完成了,下面就可以進行jfreechart的開發了。這里值得提出的是jfreechart的類結構設計前后兼容性不是很好,不同版本的jfreechart中類庫結構可能不一樣,有時候可能需要查源碼。

如果是中文顯示的時候可能依據觀感需要改變源碼的字體,不過我個人覺得這個版本比以前版本要好一些。 

三、Demo


 

<%@ page contentType="text/html;charset=GBK"%> 
<%@ page import =" java.awt.*, java.text.SimpleDateFormat,javax.swing.JPanel, 
org.jfree.chart.ChartFactory,org.jfree.chart.ChartPanel, 
org.jfree.chart.JFreeChart, 
org.jfree.chart.axis.DateAxis, 
org.jfree.chart.plot.XYPlot, 
org.jfree.chart.renderer.xy.XYItemRenderer, 
org.jfree.chart.renderer.xy.XYLineAndShapeRenderer, 
org.jfree.data.time.*, 
org.jfree.data.time.TimeSeries, 
org.jfree.data.time.TimeSeriesCollection, 
org.jfree.data.xy.XYDataset"%> 
<%@ page import="org.jfree.chart.servlet.ServletUtilities"%> 
<%@ page import="java.util.*"%> 
<%@ page import = "org.jfree.ui.RectangleInsets"%> 
<%@ page import = "java.sql.*"%> 
<% 
//連接數據庫 
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); 
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=jfree"; 
String usr="sa"; 
String pwd=""; 
Connection conn=DriverManager.getConnection(url,usr,pwd); 
Statement stmt=conn.createStatement(); 
String sql="select * from jfree order by id"; 
ResultSet rs=stmt.executeQuery(sql); 

//設置曲線,共三條曲線 
TimeSeries timeseries = new TimeSeries("平均",Minute.class);//時間的最小單位為分,線值名是“平均”
TimeSeries timeseries1 = new TimeSeries("usl",Minute.class); 
TimeSeries timeseries2 = new TimeSeries("lsl",Minute.class); 

//從數據庫中取值,數據和時間 
while(rs.next()) 

float y0=rs.getFloat("lengthavg"); 
float y1=rs.getFloat("lengthusl"); 
float y2=rs.getFloat("lengthlsl"); 
String s=rs.getString("addtime"); 
//從yyyyMMddHHmm時間格式的char中取出年月日小時分設為int值 
int x=Integer.parseInt(s.substring(0,4)); 
int y=Integer.parseInt(s.substring(4,6)); 
int z=Integer.parseInt(s.substring(6,8)); 
int a=Integer.parseInt(s.substring(8,10)); 
int b=Integer.parseInt(s.substring(10,12)); 

timeseries.add(new Minute(b,new Hour(a,new Day(z,y,x))),y0); 
timeseries1.add(new Minute(b,new Hour(a,new Day(z,y,x))),y1); 
timeseries2.add(new Minute(b,new Hour(a,new Day(z,y,x))),y2); 



//連接曲線 
TimeSeriesCollection dataset = new TimeSeriesCollection(); 
dataset.addSeries(timeseries); 
dataset.addSeries(timeseries1); 
dataset.addSeries(timeseries2); 
dataset.setDomainIsPointsInTime(true); 

//設置曲線圖 
XYDataset xydataset = (XYDataset) dataset; 
JFreeChart chart = ChartFactory.createTimeSeriesChart( 
"走勢圖", 
"時間", 
"值", 
xydataset, 
true, 
true, 
true 
); 
chart.setBackgroundPaint(Color.white);//設置曲線圖背景色 

XYPlot plot = (XYPlot) chart.getPlot(); 
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)plot.getRenderer();
plot.setBackgroundPaint(Color.white));//設置網格背景顏色 
plot.setDomainGridlinePaint(Color.pink);//設置網格豎線顏色 
plot.setRangeGridlinePaint(Color.pink);//設置網格橫線顏色 
plot.setAxisOffset(new RectangleInsets(0D, 0D, 0D, 10D));//設置曲線圖與xy軸的距離,即曲線與xy軸貼近的距離 
xylineandshaperenderer.setBaseShapesVisible(true);//設置曲線是否顯示數據點 

String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session); 
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename; 
%> 
<img src="../../<%= graphURL %>" border=0 usemap="#<%= filename %>"> 



另外說一下,以前看到有很多人都說不能顯示圖,出來一個叉,一般那都是設置的servlet的錯,我看到有的人就是用設置為servlets的 
所以就要在

String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;

中改為

String graphURL = request.getContextPath() + "/servlets /DisplayChart?filename=" + filename;

這個都要具體對待,出來叉的話有一點是肯定的,程序代碼中沒有程序錯誤,只是路徑錯誤而已 

注意:有些類沒有的話,可能是版本更換的問題,可以去源碼或者API中找找看,有可能是換了位置,也可能是換了名字。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!