一、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);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
设置曲线,共三条曲线
TimeSeries timeseries
=
new
TimeSeries(
"
平均
"
,Minute.
class
);
//
时间的最小单位为分,线值名是“平均”
TimeSeries timeseries1
=
new
TimeSeries(
"
usl
"
,Minute.
class
);
TimeSeries timeseries2
=
new
TimeSeries(
"
lsl
"
,Minute.
class
);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
从数据库中取值,数据和时间
while
(rs.next())
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
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));
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
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);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
连接曲线
TimeSeriesCollection dataset
=
new
TimeSeriesCollection();
dataset.addSeries(timeseries);
dataset.addSeries(timeseries1);
dataset.addSeries(timeseries2);
dataset.setDomainIsPointsInTime(
true
);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
设置曲线图
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轴的距离
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 %>
"
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
另外说一下,以前看到有很多人都说不能显示图,出来一个叉,一般那都是设置的servlet的错,我看到有的人就是用设置为servlets的
所以就要在String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;中
改为String graphURL = request.getContextPath() + "/servlets /DisplayChart?filename=" + filename;的
这个都要具体对待,出来叉的话有一点是肯定的,程序代码中没有程序错误,只是路径错误而已