最近在工作中需要做一个生成K线图的工具,在网上查了下发现可以用jfreechart来实现,现已完成,发上来传大家参考
1.在网上下载 jfreechart (我用的是jfreechart-1.0.8.zip) 解压之后将里面的
jfreechart-1.0.8a.jar jcommon- 1.0.12.jar 放在 项目名/WebRoot/WEB-INF/lib 下面
2.建立jsp文件:kline.jsp
说明:(1).我的数据是采用SQL数据库中的数据
(2).有些代码来源网上
<%@ page language="java" contentType="image/png;charset=GB2312"
import="java.awt.*"
import="java.text.*"
import="java.util.*"
import="org.jfree.chart.*"
import="org.jfree.chart.axis.*"
import="org.jfree.chart.servlet.*"
import="org.jfree.chart.plot.*"
import="org.jfree.chart.renderer.*"
import="org.jfree.chart.renderer.category.*"
import="org.jfree.chart.axis.*"
import="org.jfree.chart.entity.*"
import="org.jfree.chart.labels.*"
import="org.jfree.chart.title.*"
import="org.jfree.chart.urls.*"
import="org.jfree.chart.renderer.xy.*"
import="org.jfree.chart.annotations.*"
import="org.jfree.data.*"
import="org.jfree.date.DateUtilities"
import="org.jfree.data.xy.*"
import="org.jfree.data.time.*"
import="org.jfree.data.category.*"
import="org.jfree.date.SerialDate"
import="org.jfree.ui.*"
import="org.jfree.util.*"
import="java.sql.Connection"
import="java.sql.DriverManager"
import="java.sql.Statement"
import="java.sql.ResultSet"
import="org.jfree.data.time.ohlc.OHLCSeries"
import="org.jfree.data.time.ohlc.OHLCSeriesCollection"
import="java.sql.ResultDate"
import="java.text.SimpleDateFormat"
import="java.util.Date"
%>
// class JavaData3
//{
//public static void main(String[] args)
//{
//SimpleDateFormat sdf=new SimpleDateFormat("MMMM-dd-yyyy");
//Date date;
//String datetime="02-14-1984";
//try{
//date=sdf.parse(datetime);
//
// System.out.println(sdf.format(date));
// }catch(Exception e){System.out.println(e.getMessage()); }
// }
// }
<HTML>
<HEAD>
</HEAD>
<BODY>
<%
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dvcs517";//mis是数据库名称
String user="sa";//用户名
String password="13391220222";//用户密码
Connection conn= DriverManager.getConnection(url,user,password);
Statement stmt=conn.createStatement();
String stock_name=new String(request.getParameter("stock_name").getBytes("ISO-8859-1"));
String stock_date=request.getParameter("stock_date");
String sql="select * from kline where stock_name='"+stock_name+"'";// and stock_date between '"+start_date+"' and '"+stock_date+"'";//查询数据库
ResultSet rs=stmt.executeQuery(sql);
TimeSeries timeseries = new TimeSeries("日线图",Day.class);
final OHLCSeriesCollection seriesCollection = new OHLCSeriesCollection();//保留K线数据的数据集,必须申明为final,后面要在匿名内部类里面用到
while(rs.next())
{
float y0=rs.getFloat("open_value");
float y1=rs.getFloat("max_value");
float y2=rs.getFloat("min_value");
float y3=rs.getFloat("close_value");
String s=rs.getString("stock_date");
int x=Integer.parseInt(s.substring(0,4));
int y=Integer.parseInt(s.substring(5,7));
int z=Integer.parseInt(s.substring(8,10));
timeseries.add(new Day(z,y,x),y3);
OHLCSeries series = new OHLCSeries("");//高开低收数据序列,股票K线图的四个数据,依次是开,高,低,收
series.add(new Day(z,y,x),y0,y1,y2,y3);//保留K线数据的数据集,必须申明为final,后面要在匿名内部类里面用到
seriesCollection.addSeries(series);
}
// 创建子Plot对象
final CandlestickRenderer candlestickRender=new CandlestickRenderer();//设置K线图的画图器,必须申明为final,后面要在匿名内部类里面用到
candlestickRender.setUseOutlinePaint(true); //设置是否使用自定义的边框线,程序自带的边框线的颜色不符合中国股票市场的习惯
candlestickRender.setAutoWidthMethod(CandlestickRenderer.WIDTHMETHOD_AVERAGE);//设置如何对K线图的宽度进行设定
candlestickRender.setAutoWidthGap(0.001);//设置各个K线图之间的间隔
candlestickRender.setUpPaint(Color.RED);//设置股票上涨的K线图颜色
candlestickRender.setDownPaint(Color.GREEN);//设置股票下跌的K线图颜色
NumberAxis y1Axis = new NumberAxis("邮票价格(元/张)");
y1Axis.setAutoRange(true);//不不使用自动设定范围
XYPlot plot1 = new XYPlot(seriesCollection, null, y1Axis, candlestickRender);
// 创建子Plot对象2
TimeSeriesCollection dataset1 = new TimeSeriesCollection();
// 创建移动平均线数据集对象
TimeSeries mav1 = MovingAverage.createMovingAverage
(
timeseries, "20日均线", 20, 20
);
TimeSeries mav2 = MovingAverage.createMovingAverage
(
timeseries, "10日均线", 10, 10
);
TimeSeries mav3 = MovingAverage.createMovingAverage
(
timeseries, "5日均线", 5, 5
);
dataset1.addSeries(timeseries);
dataset1.addSeries(mav1);
dataset1.addSeries(mav2);
dataset1.addSeries(mav3);
// 设置子Plot对象1的右边纵轴的绘制属性
XYLineAndShapeRenderer xylineandshaperenderer = new XYLineAndShapeRenderer();
xylineandshaperenderer.setBaseShapesVisible(false);//设置曲线是否显示数据点
plot1.setDataset(1, dataset1);
y1Axis.setAutoRangeIncludesZero(false);
plot1.setRangeAxis(1, y1Axis);
plot1.setRenderer(1, xylineandshaperenderer);
plot1.mapDatasetToRangeAxis(1, 1);
// 创建父Plot对象
DateFormat df=new SimpleDateFormat("yyyy-MM-dd");//设置显示日期格式
DateAxis x1Axis=new DateAxis();//设置x轴,也就是时间轴
x1Axis.setAutoRange(true);//设置不采用自动设置时间范围
x1Axis.setAutoTickUnitSelection(true);//设置不采用自动选择刻度值
x1Axis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,5));//设置时间刻度的间隔,一般以周为单位
x1Axis.setDateFormatOverride(new SimpleDateFormat("yyyy-MM-dd"));//设置显示时间的格式
CombinedDomainXYPlot plot = new CombinedDomainXYPlot(x1Axis);
DateAxis domainAxis = (DateAxis)plot.getDomainAxis();
DateTickUnit unit = new DateTickUnit(DateTickUnit.DAY, 5, df);
domainAxis.setTickUnit(unit);
// 定义子Plot对象之间的空白
plot.setGap(10.0);
// 添加子Plot对象
plot.add(plot1, 1);
plot.setOrientation(PlotOrientation.VERTICAL);
// 创建图表
JFreeChart chart = new JFreeChart(stock_name,JFreeChart.DEFAULT_TITLE_FONT, plot, true);
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
String filename = ServletUtilities.saveChartAsPNG(chart, 700, 400, info, session);
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;
%>
<img src="<%= graphURL %>" border="0" usemap="#<%= filename%>">
</BODY>
</HTML>