Jfreechart+ChartPanel实时曲线图实例
- 格式:docx
- 大小:48.19 KB
- 文档页数:10
JFreeChart实现曲线走势图由于公司需要开发一个短信监控系统.需要用曲线图对短信的发送情况进行实时的走势图。
由于没有找到JfreeChart的中文文档,花了二天时间才把第一个Applet + JfreeChart 实现曲线图的简单例子给弄出来!现在跟大家共享。
大家一起讨论,学习JfreeChart.jfreechart-1.0.3下载址址解压jfreechart-1.0.3后,将lib目录中的jfreechart-1.0.3.jar,jcommon-1.0.6.jar二个类库加入到工程classpath中.新建一个类abc.java,代码如下.import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JApplet;import javax.swing.Timer;import org.jfree.chart.ChartPanel;import org.jfree.chart.JFreeChart;import org.jfree.chart.plot.XYPlot;import org.jfree.chart.ChartFactory;import org.jfree.chart.axis.ValueAxis;import org.jfree.data.time.*;/*** 一个简单的曲线图例子* @author tf* date 2007-01-30*/public class abc extends JApplet {private static final long serialVersionUID=3257566209007171634L;private double cpuValue1;private double cpuValue2;private double cpuValue3private TimeSeries cpu1;private TimeSeries cpu2;private TimeSeries cpu3;/*** 内部类--实现动态随机产生虚拟CPU使用率的值* @author tf**/class DataGenerator extends Timer implements ActionListener {private static final long serialVersionUID = 3977867288743720505L;public void actionPerformed(ActionEvent actionevent) {cpuValue1 = 100;cpuValue2 = 100;cpuValue3 = 100;double d1 = Math.random();cpuValue1 = cpuValue1 * d1;//cpuValue1 += 10;double d2 = Math.random();cpuValue2 = cpuValue2 * d2;double d3 = Math.random();cpuValue3 = cpuValue3 * d3;addcpu1Observation(cpuValue1);addcpu2Observation(cpuValue2);addcpu3Observation(cpuValue3);}DataGenerator() {super(100, null);addActionListener(this);}}public abc() {cpu1 = new TimeSeries("处理器1", lisecond.class);//增加一条走势曲线//cpu1.setHistoryCount(2000); //---比方法在新版本中的TimeSeries类中不存在cpu2 = new TimeSeries("处理器2", Millisecond.class);//free.setHistoryCount(2000); //---比方法在新版本中的TimeSeries类中不存在cpu3 = new TimeSeries("处理器3", Millisecond.class);TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();//将所有走势曲线加入到时间条中timeseriescollection.addSeries(cpu1);timeseriescollection.addSeries(cpu2);timeseriescollection.addSeries(cpu3);//创建JFreeChart对象JFreeChart jfreechart = ChartFactory.createTimeSeriesChart("处理器利用率","时间", "值", timeseriescollection, true, true, true);//设置图表样式XYPlot xyplot = jfreechart.getXYPlot();xyplot.setOutlinePaint(Color.CYAN);//设置数据区的边界线条颜色ValueAxis valueaxis = xyplot.getDomainAxis();// valueaxis.setAutoRange(true); //自动设置数据轴数据范围valueaxis.setFixedAutoRange(10000D);//设置时间轴显示的数据valueaxis = xyplot.getRangeAxis();valueaxis.setRange(0.0D, 100D);//数据轴固定数据范围(设置100的话就是显示MAXVALUE 到MAXVALUE-100那段数据范围)// valueaxis.setAutoRange(true);valueaxis.setVisible(true);//设置是否显示数据轴//设置曲线图面版ChartPanel chartpanel = new ChartPanel(jfreechart);chartpanel.setPopupMenu(null);ChartPanel chartpanel1 = new ChartPanel(jfreechart);chartpanel1.setPopupMenu(null);getContentPane().add(chartpanel);getContentPane().add(chartpanel1);(new DataGenerator()).start();}private void addcpu1Observation(double d) {cpu1.add(new Millisecond(), d);}private void addcpu2Observation(double d) {cpu2.add(new Millisecond(), d);}private void addcpu3Observation(double d) {cpu3.add(new Millisecond(), d);}}代码运行成功如下:呵呵,忙了二天终于搞定了这么个简单的例子.希望大家共同学习.多多提意见.其它与JfreeChart相关设置的类和方法JFreeChart类:void setAntiAlias(boolean flag) 字体模糊边界void setBackgroundImage(Image image) 背景图片void setBackgroundImageAlignment(int alignment) 背景图片对齐方式(参数常量在org.jfree.ui.Align类中定义)void setBackgroundImageAlpha(float alpha) 背景图片透明度(0.0~1.0)void setBackgroundPaint(Paint paint) 背景色void setBorderPaint(Paint paint) 边界线条颜色void setBorderStroke(Stroke stroke) 边界线条笔触void setBorderVisible(boolean visible) 边界线条是否可见TextTitle类:void setFont(Font font) 标题字体void setPaint(Paint paint) 标题字体颜色void setText(String text) 标题内容StandardLegend(Legend)类:void setBackgroundPaint(Paint paint) 图示背景色void setTitle(String title) 图示标题内容void setTitleFont(Font font) 图示标题字体void setBoundingBoxArcWidth(int arcWidth) 图示边界圆角宽void setBoundingBoxArcHeight(int arcHeight) 图示边界圆角高void setOutlinePaint(Paint paint) 图示边界线条颜色void setOutlineStroke(Stroke stroke) 图示边界线条笔触void setDisplaySeriesLines(boolean flag) 图示项是否显示横线(折线图有效)void setDisplaySeriesShapes(boolean flag) 图示项是否显示形状(折线图有效)void setItemFont(Font font) 图示项字体void setItemPaint(Paint paint) 图示项字体颜色void setAnchor(int anchor) 图示在图表中的显示位置(参数常量在Legend类中定义)Axis类:void setVisible(boolean flag) 坐标轴是否可见void setAxisLinePaint(Paint paint) 坐标轴线条颜色(3D轴无效)void setAxisLineStroke(Stroke stroke) 坐标轴线条笔触(3D轴无效)void setAxisLineVisible(boolean visible) 坐标轴线条是否可见(3D轴无效)void setFixedDimension(double dimension) (用于复合表中对多坐标轴的设置)void setLabel(String label) 坐标轴标题void setLabelFont(Font font) 坐标轴标题字体void setLabelPaint(Paint paint) 坐标轴标题颜色void setLabelAngle(double angle)` 坐标轴标题旋转角度(纵坐标可以旋转)void setTickLabelFont(Font font) 坐标轴标尺值字体void setTickLabelPaint(Paint paint) 坐标轴标尺值颜色void setTickLabelsVisible(boolean flag) 坐标轴标尺值是否显示void setTickMarkPaint(Paint paint) 坐标轴标尺颜色void setTickMarkStroke(Stroke stroke) 坐标轴标尺笔触void setTickMarksVisible(boolean flag) 坐标轴标尺是否显示ValueAxis(Axis)类:void setAutoRange(boolean auto) 自动设置数据轴数据范围void setAutoRangeMinimumSize(double size) 自动设置数据轴数据范围时数据范围的最小跨度void setAutoTickUnitSelection(boolean flag) 数据轴的数据标签是否自动确定(默认为true)void setFixedAutoRange(double length) 数据轴固定数据范围(设置100的话就是显示MAXVALUE到MAXVALUE-100那段数据范围)void setInverted(boolean flag) 数据轴是否反向(默认为false)void setLowerMargin(double margin) 数据轴下(左)边距void setUpperMargin(double margin) 数据轴上(右)边距void setLowerBound(double min) 数据轴上的显示最小值void setUpperBound(double max) 数据轴上的显示最大值void setPositiveArrowVisible(boolean visible) 是否显示正向箭头(3D轴无效)void setNegativeArrowVisible(boolean visible) 是否显示反向箭头(3D轴无效)void setVerticalTickLabels(boolean flag) 数据轴数据标签是否旋转到垂直void setStandardTickUnits(TickUnitSource source) 数据轴的数据标签(可以只显示整数标签,需要将AutoTickUnitSelection设false)NumberAxis(ValueAxis)类:void setAutoRangeIncludesZero(boolean flag) 是否强制在自动选择的数据范围中包含0 void setAutoRangeStickyZero(boolean flag) 是否强制在整个数据轴中包含0,即使0不在数据范围中void setNumberFormatOverride(NumberFormat formatter) 数据轴数据标签的显示格式void setTickUnit(NumberTickUnit unit) 数据轴的数据标签(需要将AutoTickUnitSelection 设false)DateAxis(ValueAxis)类:void setMaximumDate(Date maximumDate) 日期轴上的最小日期void setMinimumDate(Date minimumDate) 日期轴上的最大日期void setRange(Date lower,Date upper) 日期轴范围void setDateFormatOverride(DateFormat formatter) 日期轴日期标签的显示格式void setTickUnit(DateTickUnit unit) 日期轴的日期标签(需要将AutoTickUnitSelection设false)void setTickMarkPosition(DateTickMarkPosition position) 日期标签位置(参数常量在org.jfree.chart.axis.DateTickMarkPosition类中定义)CategoryAxis(Axis)类:void setCategoryMargin(double margin) 分类轴边距void setLowerMargin(double margin) 分类轴下(左)边距void setUpperMargin(double margin) 分类轴上(右)边距void setVerticalCategoryLabels(boolean flag) 分类轴标题是否旋转到垂直void setMaxCategoryLabelWidthRatio(float ratio) 分类轴分类标签的最大宽度Plot类:void setBackgroundImage(Image image) 数据区的背景图片void setBackgroundImageAlignment(int alignment) 数据区的背景图片对齐方式(参数常量在org.jfree.ui.Align类中定义)void setBackgroundPaint(Paint paint) 数据区的背景图片背景色void setBackgroundAlpha(float alpha) 数据区的背景透明度(0.0~1.0)void setForegroundAlpha(float alpha) 数据区的前景透明度(0.0~1.0)void setDataAreaRatio(double ratio) 数据区占整个图表区的百分比void setOutLinePaint(Paint paint) 数据区的边界线条颜色void setOutLineStroke(Stroke stroke) 数据区的边界线条笔触void setNoDataMessage(String message) 没有数据时显示的消息void setNoDataMessageFont(Font font) 没有数据时显示的消息字体void setNoDataMessagePaint(Paint paint) 没有数据时显示的消息颜色CategoryPlot(Plot)类:void setDataset(CategoryDataset dataset) 数据区的2维数据表void setColumnRenderingOrder(SortOrder order) 数据分类的排序方式void setAxisOffset(RectangleInsets args) 坐标轴到数据区的间距void setOrientation(PlotOrientation orientation) 数据区的方向(PlotOrientation.HORIZONTAL 或PlotOrientation.VERTICAL)void setDomainAxis(CategoryAxis axis) 数据区的分类轴void setDomainAxisLocation(AxisLocation location) 分类轴的位置(参数常量在org.jfree.chart.axis.AxisLocation类中定义)void setDomainGridlinesVisible(boolean visible) 分类轴网格是否可见void setDomainGridlinePaint(Paint paint) 分类轴网格线条颜色void setDomainGridlineStroke(Stroke stroke) 分类轴网格线条笔触void setRangeAxis(ValueAxis axis) 数据区的数据轴void setRangeAxisLocation(AxisLocation location) 数据轴的位置(参数常量在org.jfree.chart.axis.AxisLocation类中定义)void setRangeGridlinesVisible(boolean visible) 数据轴网格是否可见void setRangeGridlinePaint(Paint paint) 数据轴网格线条颜色void setRangeGridlineStroke(Stroke stroke) 数据轴网格线条笔触void setRenderer(CategoryItemRenderer renderer) 数据区的表示者(详见Renderer组)void addAnnotation(CategoryAnnotation annotation) 给数据区加一个注释void addRangeMarker(Marker marker,Layer layer) 给数据区加一个数值范围区域PiePlot(Plot)类:void setDataset(PieDataset dataset) 数据区的1维数据表void setIgnoreNullValues(boolean flag) 忽略无值的分类void setCircular(boolean flag) 饼图是否一定是正圆void setStartAngle(double angle) 饼图的初始角度void setDirection(Rotation direction) 饼图的旋转方向void setExplodePercent(int section,double percent) 抽取的那块(1维数据表的分类下标)以及抽取出来的距离(0.0~1.0),3D饼图无效void setLabelBackgroundPaint(Paint paint) 分类标签的底色void setLabelFont(Font font) 分类标签的字体void setLabelPaint(Paint paint) 分类标签的字体颜色void setLabelLinkMargin(double margin) 分类标签与图的连接线边距void setLabelLinkPaint(Paint paint) 分类标签与图的连接线颜色void setLabelLinkStroke(Stroke stroke) 分类标签与图的连接线笔触void setLabelOutlinePaint(Paint paint) 分类标签边框颜色void setLabelOutlineStroke(Paint paint) 分类标签边框笔触void setLabelShadowPaint(Paint paint) 分类标签阴影颜色void setMaximumLabelWidth(double width) 分类标签的最大长度(0.0~1.0)void setPieIndex(int index) 饼图的索引(复合饼图中用到)void setSectionOutlinePaint(int section,Paint paint) 指定分类饼的边框颜色void setSectionOutlineStroke(int section,Stroke stroke) 指定分类饼的边框笔触void setSectionPaint(int section,Paint paint) 指定分类饼的颜色void setShadowPaint(Paint paint) 饼图的阴影颜色void setShadowXOffset(double offset) 饼图的阴影相对图的水平偏移void setShadowYOffset(double offset) 饼图的阴影相对图的垂直偏移void setLabelGenerator(PieSectionLabelGenerator generator) 分类标签的格式,设置成null 则整个标签包括连接线都不显示void setToolTipGenerator(PieToolTipGenerator generator) MAP中鼠标移上的显示格式void setURLGenerator(PieURLGenerator generator) MAP中钻取链接格式PiePlot3D(PiePlot)类:void setDepthFactor(double factor) 3D饼图的Z轴高度(0.0~1.0)MultiplePiePlot(Plot)类:void setLimit(double limit) 每个饼图之间的数据关联(详细比较复杂)void setPieChart(JFreeChart pieChart) 每个饼图的显示方式(见JFreeChart类个PiePlot类)AbstractRenderer类:void setItemLabelAnchorOffset(double offset) 数据标签的与数据点的偏移void setItemLabelsVisible(boolean visible) 数据标签是否可见void setItemLabelFont(Font font) 数据标签的字体void setItemLabelPaint(Paint paint) 数据标签的字体颜色void setItemLabelPosition(ItemLabelPosition position) 数据标签位置void setPositiveItemLabelPosition(ItemLabelPosition position) 正数标签位置void setNegativeItemLabelPosition(ItemLabelPosition position) 负数标签位置void setOutLinePaint(Paint paint) 图形边框的线条颜色void setOutLineStroke(Stroke stroke) 图形边框的线条笔触void setPaint(Paint paint) 所有分类图形的颜色void setShape(Shape shape) 所有分类图形的形状(如折线图的点)void setStroke(Stroke stroke) 所有分类图形的笔触(如折线图的线)void setSeriesItemLabelsVisible(int series,boolean visible) 指定分类的数据标签是否可见void setSeriesItemLabelFont(int series,Font font) 指定分类的数据标签的字体void setSeriesItemLabelPaint(int series,Paint paint) 指定分类的数据标签的字体颜色void setSeriesItemLabelPosition(int series,ItemLabelPosition position) 数据标签位置void setSeriesPositiveItemLabelPosition(int series,ItemLabelPosition position) 正数标签位置void setSeriesNegativeItemLabelPosition(int series,ItemLabelPosition position) 负数标签位置void setSeriesOutLinePaint(int series,Paint paint) 指定分类的图形边框的线条颜色void setSeriesOutLineStroke(int series,Stroke stroke) 指定分类的图形边框的线条笔触void setSeriesPaint(int series,Paint paint) 指定分类图形的颜色void setSeriesShape(int series,Shape shape) 指定分类图形的形状(如折线图的点)void setSeriesStroke(int series,Stroke stroke) 指定分类图形的笔触(如折线图的线)AbstractCategoryItemRenderer(AbstractRenderer)类:void setLabelGenerator(CategoryLabelGenerator generator) 数据标签的格式void setToolTipGenerator(CategoryToolTipGenerator generator) MAP中鼠标移上的显示格式void setItemURLGenerator(CategoryURLGenerator generator) MAP中钻取链接格式void setSeriesLabelGenerator(int series,CategoryLabelGenerator generator) 指定分类的数据标签的格式void setSeriesToolTipGenerator(int series,CategoryToolTipGenerator generator) 指定分类的MAP中鼠标移上的显示格式void setSeriesItemURLGenerator(int series,CategoryURLGenerator generator) 指定分类的MAP中钻取链接格式BarRenderer(AbstractCategoryItemRenderer)类:void setDrawBarOutline(boolean draw) 是否画图形边框void setItemMargin(double percent) 每个BAR之间的间隔void setMaxBarWidth(double percent) 每个BAR的最大宽度void setMinimumBarLength(double min) 最短的BAR长度,避免数值太小而显示不出void setPositiveItemLabelPositionFallback(ItemLabelPosition position) 无法在BAR中显示的正数标签位置void setNegativeItemLabelPositionFallback(ItemLabelPosition position) 无法在BAR中显示的负数标签位置BarRenderer3D(BarRenderer)类:void setWallPaint(Paint paint) 3D坐标轴的墙体颜色StackedBarRenderer(BarRenderer)类StackedBarRenderer3D(BarRenderer3D)类GroupedStackedBarRenderer(StackedBarRenderer)类:void setSeriesToGroupMap(KeyToGroupMap map) 将分类自由的映射成若干个组(KeyToGroupMap.mapKeyToGroup(series,group))LayeredBarRenderer(BarRenderer)类:void setSeriesBarWidth(int series,double width) 设定每个分类的宽度(注意设置不要使某分类被覆盖)WaterfallBarRenderer(BarRenderer)类:void setFirstBarPaint(Paint paint) 第一个柱图的颜色void setLastBarPaint(Paint paint) 最后一个柱图的颜色void setPositiveBarPaint(Paint paint) 正值柱图的颜色void setNegativeBarPaint(Paint paint) 负值柱图的颜色IntervalBarRenderer(BarRenderer)类:需要传IntervalCategoryDataset作为数据源GanttBarRenderer(IntervalBarRenderer)类:void setCompletePaint(Paint paint) 完成进度颜色void setIncompletePaint(Paint paint) 未完成进度颜色void setStartPercent(double percent) 设置进度条在整条中的起始位置(0.0~1.0)void setEndPercent(double percent) 设置进度条在整条中的结束位置(0.0~1.0)StatisticBarRenderer(BarRenderer)类:需要传StatisticCategoryDataset作为数据源LineAndShapeRenderer(AbstractCategoryItemRenderer)类:void setDrawLines(boolean draw) 是否折线的数据点之间用线连void setDrawShapes(boolean draw) 是否折线的数据点根据分类使用不同的形状void setShapesFilled(boolean filled) 所有分类是否填充数据点图形void setSeriesShapesFilled(int series,boolean filled) 指定分类是否填充数据点图形void setUseFillPaintForShapeOutline(boolean use) 指定是否填充数据点的Paint也被用于画数据点形状的边框LevelRenderer(AbstractCategoryItemRenderer)类:void setItemMargin(double percent) 每个分类之间的间隔void setMaxItemWidth(double percent) 每个分类的最大宽度CategoryStepRenderer(AbstractCategoryItemRenderer)类:void setStagger(boolean shouldStagger) 不同分类的图是否交错MinMaxCategoryRenderer(AbstractCategoryItemRenderer)类:void setDrawLines(boolean drawLines) 是否在每个分类线间画连接线void setGroupPaint(Paint groupPaint) 一组图形连接线的颜色void setGroupStroke(Stroke groupStroke) 一组图形连接线的笔触void setMaxIcon(Icon maxIcon) 最大值的ICONvoid setMinIcon(Icon minIcon) 最小值的ICONvoid setObjectIcon(Icon objectIcon) 所有值的ICONAreaRender(AbstractCategoryItemRenderer)类StackedAreaRender(AreaRender)类。
1.1通过代码实例跟我学JFreeChart 图表组件——在J2EE Web应用系统中采用JSP+JavaBean方式应用JFreeChart的实例(第1部分)1.1.1实现圆饼图的应用实例1、添加一个请求的页面requestImageForm.jsp(1)添加requestImageForm.jsp页面文件(2)在该页面中添加一个表单<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>请求的页面</title></head><body><form action="showSomeImage.jsp" method="post">图像的宽度:<input type="text" name="imagesWidth" /> <br>图像的高度:<input type="text" name="imagesHeight" /> <br>图像的标题:<input type="text" name="imagesTitle" /> <br><input type="submit" value="提交" /></form></body></html>2、添加一个响应的JSP页面showSomeImage.jsp(1)添加JSP页面showSomeImage.jsp文件(2)编程设计showSomeImage.jsp页面<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%><%request.setCharacterEncoding("gb2312");String imagesWidth=request.getParameter("imagesWidth");String imagesHeight=request.getParameter("imagesHeight");String imagesTitle=request.getParameter("imagesTitle");%><%com.px1987.jfreechart.model.PieChartBean pieChartBeanID=new com.px1987.jfreechart.model.PieChartBean();pieChartBeanID.setImagesWidth(imagesWidth);pieChartBeanID.setImagesHeight(imagesHeight);pieChartBeanID.setImagesTitle(imagesTitle);pieChartBeanID.setPageContext(pageContext);pieChartBeanID.createImage();%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>My JSP 'showSomeImage.jsp' starting page</title></head><body><table border="1" align="center" bordercolor="#6699FF" class="wd_red"><tr><td>这是Pie图的数据</td><td rowspan="3" align="center"><img src="<%= pieChartBeanID.getTargetGraphURL() %>" border=0 usemap="#<%= pieChartBeanID.getGraphFileName() %>"></td></tr><tr><td>这是Pie图的其它数据</td></tr><tr><td>这是Pie图的其它数据</td></tr></table></body></html>3、添加PieChartBean组件(1)添加PieChartBean程序类(2)编程WebPieChartBean 程序类中的功能实现方法package com.px1987.jfreechart.model;import java.io.IOException;import javax.servlet.http.HttpServletRequest;import javax.servlet.jsp.PageContext;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartRenderingInfo;import org.jfree.chart.JFreeChart;import org.jfree.chart.entity.StandardEntityCollection; import org.jfree.chart.plot.PiePlot;import org.jfree.chart.servlet.ServletUtilities;import org.jfree.data.general.DefaultPieDataset;public class WebPieChartBean {String graphFileName=null;String targetGraphURL =null;JFreeChart oneJFreeChart=null;PageContext pageContext;HttpServletRequest request=null;String imagesWidth=null;String imagesHeight=null;String imagesTitle=null;public WebPieChartBean() {}public void createImage() throws IOException{oneJFreeChart=ChartFactory.createPieChart(imagesTitle, // 图表标题getDataSet(), true, // 是否显示图例false, // 是否显示tooltipsfalse); //是否显示URLsPiePlot pieplot = (PiePlot)oneJFreeChart.getPlot(); //通过JFreeChart 对象获得PiePlot,然后对它进行修改和定制pieplot.setNoDataMessage("没有合适的图表的数据"); // 没有数据的时候显示的内容ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());graphFileName =ServletUtilities.saveChartAsPNG(oneJFreeChart,Integer.parseInt(imagesWidth),Integer.parseInt(imagesHeight),info, pageContext.getSession());request=(HttpServletRequest)getPageContext().getRequest();targetGraphURL =request.getContextPath()+ "/DisplayChartServlet?filename="+ graphFileName;}public void createImageMVC() throws IOException{oneJFreeChart=ChartFactory.createPieChart(imagesTitle, // 图表标题getDataSet(), true, // 是否显示图例false, // 是否显示tooltipsfalse); //是否显示URLsPiePlot pieplot = (PiePlot)oneJFreeChart.getPlot(); //通过JFreeChart 对象获得PiePlot,然后对它进行修改和定制pieplot.setNoDataMessage("没有合适的图表的数据"); // 没有数据的时候显示的内容ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());graphFileName =ServletUtilities.saveChartAsPNG(oneJFreeChart,Integer.parseInt(imagesWidth),Integer.parseInt(imagesHeight),info, getRequest().getSession());targetGraphURL =getRequest().getContextPath()+ "/DisplayChartServlet?filename="+ graphFileName;}private DefaultPieDataset getDataSet(){DefaultPieDataset dataset = new DefaultPieDataset();dataset.setValue("Java",100);dataset.setValue("C++",200);dataset.setValue("Basica",300);dataset.setValue("J2EE",400);dataset.setValue("",500);return dataset;}public String getGraphFileName() {return graphFileName;}public void setGraphFileName(String graphFileName) {this.graphFileName = graphFileName;}public String getTargetGraphURL() {return targetGraphURL;}public void setTargetGraphURL(String targetGraphURL) { this.targetGraphURL = targetGraphURL;}public PageContext getPageContext() {return pageContext;}public void setPageContext(PageContext pageContext) { this.pageContext = pageContext;}public String getImagesHeight() {return imagesHeight;}public void setImagesHeight(String imagesHeight) { this.imagesHeight = imagesHeight;}public String getImagesTitle() {return imagesTitle;}public void setImagesTitle(String imagesTitle) {this.imagesTitle = imagesTitle;}public String getImagesWidth() {return imagesWidth;}public void setImagesWidth(String imagesWidth) { this.imagesWidth = imagesWidth;}public HttpServletRequest getRequest() {return request;}public void setRequest(HttpServletRequest request) {this.request = request;}}4、测试本示例的应用效果(1)在浏览器的URL地址栏中输入http://127.0.0.1:8080/JFreeChart/requestImageForm.jsp(2)在表单中输入图表相关的工作参数,并提交表单,将出现下面的执行结果。
jfreechart+sql实现时间曲线图(显示曲线数据点)一、JFreeChart获取。
JFreeChart是JFreeChart公司在开源网站上的一个项目,该公司的主要产品有如下:1、JFreeReport:报表解决工具2、JFreeChart:Java图形解决方案(Application/Applet/Servlet/Jsp)3、JCommon:JFreeReport和JFreeChart的公共类库4、JFreeDesigner:JFreeReport的报表设计工具我们可以从jfree官方网站上获取最新版本和相关资料(但是jfree的document需要40美金才能获取),获取地址:/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.jar3、如果是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-cl ass></servlet><servlet-mapping><servlet-name>DisplayChart</servlet-name><url-pattern>/servlet/DisplayChart</url-pattern></servlet-mapping>至此jfreechart的配置就完成了,下面就可以进行jfreechart的开发了。
jfreechart用法例子一、饼图:DefaultPieDataset dataset=new DefaultPieDataset();//开始填充数据dataset.setValue("Java", new Double(43.200000000000003D));dataset.setValue("Visual Basic", new Double(10D));dataset.setValue("C/C++", new Double(17.5D));dataset.setValue("PHP", new Double(32.5D));dataset.setValue("Perl", new Double(12.5D));JFreeChart chart=ChartFactory.createPieChart("2D饼型图",dataset,true,true,true);chart.setTitle("统计图");//设置图片标题ChartRenderingInfo info=new ChartRenderingInfo(new StandardEntityCollection());StringimgaeFileName=ServletUtilities.saveChartAsJPEG(chart,300,200, info,session);//设置生成图片,包括图片的大小,长度是300,宽是200session.setAttribute("image_name1",imageFileName;String URL= request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;//Display为org.jfree.chart.servlet.DisplayChartsession.setAttribute("image_url1",URL);显示代码:(以下显示代码不注明了,是一样的,只是session中的属性名不同而已,大家注意区别)" width=300 height=200 border=0 usemap="#<%=session.getAttribute("image_name1") %>">二、3D饼图DefaultPieDataset defaultpiedataset = new DefaultPieDataset();defaultpiedataset.setValue("Java", new Double(43.200000000000003D));defaultpiedataset.setValue("Visual Basic", new Double(10D));defaultpiedataset.setValue("C/C++", new Double(17.5D));defaultpiedataset.setValue("PHP", new Double(32.5D));defaultpiedataset.setValue("Perl", new Double(12.5D));JFreeChart jfreechart = ChartFactory.createPieChart3D("3D 饼图", defaultpiedataset, true, false, false);PiePlot3D pieplot3d = (PiePlot3D)jfreechart.getPlot();String imageFileName2= ServletUtilities.saveChartAsJPEG(jfreechart,300,200,session);session.setAttribute("image_name2",imageFileName2);StringURL=request.getContextPath()+"/servlet/DisplayChart?filename ="+imageFileName2;session.setAttribute("image_url2",URL);三、柱图DefaultCategoryDataset dataset=new DefaultCategoryDataset();//设置数据源dataset.setValue(new Double(43.200000000000003D),"图解","Java" );dataset.setValue( new Double(10D),"图解","Visual Basic");dataset.setValue(new Double(17.5D), "图解","C/C++");dataset.setValue(new Double(32.5D), "图解","PHP");dataset.setValue(new Double(12.5D), "图解","Perl");//添加数据,参数包括名称和数值JFreeChart chart1=ChartFactory.createBarChart3D("柱图","大人物","地盘", dataset,PlotOrientation.VERTICAL,false,false,false);CategoryPlot plot=chart1.getCategoryPlot();//BarRenderer3D renderer1=new BarRenderer3D();final BarRenderer renderer1 = (BarRenderer)plot.getRenderer();renderer1.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());renderer1.setItemLabelsVisible(true);//显示每个柱子上的数据renderer1.setItemMargin(0.1);//设置每个柱子之间的距离plot.setRenderer(renderer1);//让上面对柱子的设置生效StringimageFileName=ServletUtilities.saveChartAsJPEG(chart1,300,20 0,session);//生成图片,包括图片的大小session.setAttribute("image_name3",imageFileName);StringURL=request.getContextPath()+"/servlet/DisplayChart?filename ="+imageFileName;session.setAttribute("image_url3",URL);四、线图DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();defaultcategorydataset.addValue(212D, "Classes", "JDK 1.0");defaultcategorydataset.addValue(504D, "Classes", "JDK 1.1");defaultcategorydataset.addValue(1520D, "Classes", "SDK 1.2");defaultcategorydataset.addValue(1842D, "Classes", "SDK 1.3");defaultcategorydataset.addValue(2991D, "Classes", "SDK 1.4");JFreeChart jfreechart = ChartFactory.createLineChart("Java Standard Class Library", "线图", "Class Count", defaultcategorydataset, PlotOrientation.VERTICAL, false, true, false);jfreechart.addSubtitle(new TextTitle("Number of Classes By Release"));TextTitle texttitle = new TextTitle("线图");texttitle.setFont(new Font("SansSerif", 0, 10));texttitle.setPosition(RectangleEdge.BOTTOM);texttitle.setHorizontalAlignment(HorizontalAlignment.RIGH T);jfreechart.addSubtitle(texttitle);jfreechart.setBackgroundPaint(Color.white);CategoryPlot categoryplot = (CategoryPlot)jfreechart.getPlot();categoryplot.setBackgroundPaint(Color.lightGray);categoryplot.setRangeGridlinePaint(Color.white);NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();numberaxis.setStandardTickUnits(NumberAxis.createInteger TickUnits());LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)categoryplot.getRenderer();lineandshaperenderer.setShapesVisible(true);lineandshaperenderer.setDrawOutlines(true);lineandshaperenderer.setUseFillPaint(true);lineandshaperenderer.setFillPaint(Color.white);String imageFileName4 = ServletUtilities.saveChartAsJPEG(jfreechart,500,500,session);session.setAttribute("image_name4",imageFileName4);StringURL=request.getContextPath()+"/servlet/DisplayChart?filename ="+imageFileName4;session.setAttribute("image_url4",URL);五、时序图TimeSeries timeseries = new TimeSeries("Random Data");Dayday = new Day(1, 1, 1990);double d = 100D;for(int j = 0; j < 4000; j++)try{d = (d + Math.random()) - 0.5D;timeseries.add(day, new Double(d));day = (Day)day.next();}catch(SeriesException seriesexception){System.err.println("Error adding to series");}XYDataset xydataset = new TimeSeriesCollection(timeseries);JFreeChart jfreechart = ChartFactory.createTimeSeriesChart("时序图", "Day", "Value", xydataset, false, false, false);XYPlot xyplot = (XYPlot)jfreechart.getPlot();XYLineAndShapeRenderer xylineandshaperenderer = new XYLineAndShapeRenderer();xylineandshaperenderer.setDefaultShapesVisible(false);xylineandshaperenderer.setSeriesStroke(0, new BasicStroke(0.5F, 1, 1, 5F, new float[] {5F, 10F}, 0.0F));xyplot.setRenderer(xylineandshaperenderer);String imageFileName5 = ServletUtilities.saveChartAsJPEG(jfreechart,500,500,session);session.setAttribute("image_name5",imageFileName5);StringURL=request.getContextPath()+"/servlet/DisplayChart?filename ="+imageFileName5;session.setAttribute("image_url5",URL);。
Jfreechart+ChartPanel实时曲线图实例如图:package com.wl.test.servlet;import java.awt.AWTException;import java.awt.Color;import java.awt.Dimension;import java.awt.Frame;import java.awt.Image;import java.awt.MenuItem;import java.awt.PopupMenu;import java.awt.SystemTray;import java.awt.Toolkit;import java.awt.TrayIcon;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.util.Calendar;import java.util.Random;import javax.swing.JFrame;import javax.swing.JOptionPane;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartPanel;import org.jfree.chart.JFreeChart;import org.jfree.chart.axis.NumberTickUnit;import org.jfree.chart.axis.ValueAxis;import bels.ItemLabelAnchor;import bels.ItemLabelPosition;import bels.StandardXYItemLabelGenerator; import org.jfree.chart.plot.XYPlot;import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.chart.title.TextTitle;import lisecond;import org.jfree.data.time.TimeSeries;import org.jfree.data.time.TimeSeriesCollection;import org.jfree.ui.TextAnchor;public class TEST4 extends JFrame {/**-* @author wanglong-* @description JfreeChart+ChartPanel实时曲线图* @param args-*/private TrayIcon trayIcon;TimeSeries ts,ts2;public static void main(String[] args) {// TODO Auto-generated method stub-new TEST4();}public TEST4(){jbinit();}public void jbinit(){this.getContentPane().setLayout(null);this.setSize(600,400);this.setResizable(false);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);//设置默认的关闭窗口的方式MyTray();MyAction();MyChart();StartThread();this.show();}public void MyChart(){ts=new TimeSeries("温度",Millisecond.class);ts2=new TimeSeries("湿度",Millisecond.class);TimeSeriesCollection tsc=new TimeSeriesCollection();tsc.addSeries(ts);tsc.addSeries(ts2);JFreeChart jfChart=ChartFactory.createTimeSeriesChart("实时曲线图","时间", "数值", tsc, true, true, true);TextTitle subTitle=new TextTitle(String.valueOf(Calendar.getInstance().get(Calendar.YEAR))+"年份");jfChart.addSubtitle(subTitle);//设置子标题XYPlot xyPlot=(XYPlot)jfChart.getPlot();xyPlot.setDomainGridlinePaint(Color.red);//设置竖网格颜色xyPlot.setRangeGridlinePaint(Color.orange);//设置横网格颜色ValueAxis vx=xyPlot.getDomainAxis();//vx.setRange(0.0D,2000D);//设置Y轴范围//坐标轴标尺值字体//vx.setTickLabelFont(new Font("Serif",Font.CENTER_BASELINE,13));-//vx.setLabelFont(new Font("Serif",Font.CENTER_BASELINE,15));-//纵坐标间距设置//vx.setTickUnit(new NumberTickUnit(20));-vx.setAutoRange(true);XYLineAndShapeRenderer xr=(XYLineAndShapeRenderer)xyPlot.getRenderer();xr.setSeriesPaint(0, Color.blue);//设置线的颜色xr.setSeriesPaint(1, Color.green);xr.setBaseShapesVisible(true);//显示线上各个数据点//显示数据点上的数据值xr.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());xr.setBasePositiveItemLabelPosition(newItemLabelPosition(ItemLabelAnchor.OUTSIDE12,TextAnchor.BASELINE_RIGHT));xr.setBaseItemLabelsVisible(true);ChartPanel cp=new ChartPanel(jfChart);cp.setSize(new Dimension(550,350));this.getContentPane().add(cp);}public void StartThread(){DataThread dt=new DataThread();dt.start();}public void MyAction(){this.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e) {int result=JOptionPane.showConfirmDialog(null, "确定要退出吗?","退出",JOptionPane.OK_CANCEL_OPTION);if(result==JOptionPane.OK_OPTION){System.exit(0);}}public void windowIconified(WindowEvent e){if(SystemTray.isSupported()){setVisible(false);SystemTray st=SystemTray.getSystemTray();try {st.add(trayIcon);//添加系统托盘} catch (AWTException e1) {// TODO Auto-generated catch block-e1.printStackTrace();}}}});}public void MyTray(){PopupMenu pm=new PopupMenu();MenuItem showItem=new MenuItem("SHOW");MenuItem exitItem=new MenuItem("EXIT");pm.add(showItem);pm.add(exitItem);Image image = Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource("wap.jpg"));trayIcon=new TrayIcon(image,"chart test",pm);showItem.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stub-setVisible(true);setExtendedState(Frame.NORMAL);SystemTray.getSystemTray().remove(trayIcon);//移除系统托盘}});exitItem.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){int result=JOptionPane.showConfirmDialog(null, "确实要退出吗?","退出",JOptionPane.OK_CANCEL_OPTION);if(result==JOptionPane.OK_OPTION){System.exit(0);}}});}class DataThread extends Thread{public void run(){while(true){Millisecond ms=new Millisecond();ts.add(ms,new Random().nextInt(500)); ts2.add(ms,new Random().nextInt(500)); try {this.sleep(30000);} catch (InterruptedException e) {// TODO Auto-generated catch block-e.printStackTrace();}}} } }。
Jfreechart+ChartPanel实时曲线图实例如图:package com.wl.test.servlet;import java.awt.AWTException;import java.awt.Color;import java.awt.Dimension;import java.awt.Frame;import java.awt.Image;import java.awt.MenuItem;import java.awt.PopupMenu;import java.awt.SystemTray;import java.awt.Toolkit;import java.awt.TrayIcon;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.util.Calendar;import java.util.Random;import javax.swing.JFrame;import javax.swing.JOptionPane;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartPanel;import org.jfree.chart.JFreeChart;import org.jfree.chart.axis.NumberTickUnit;import org.jfree.chart.axis.ValueAxis;import bels.ItemLabelAnchor;import bels.ItemLabelPosition;import bels.StandardXYItemLabelGenerator; import org.jfree.chart.plot.XYPlot;import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.chart.title.TextTitle;import lisecond;import org.jfree.data.time.TimeSeries;import org.jfree.data.time.TimeSeriesCollection;import org.jfree.ui.TextAnchor;public class TEST4 extends JFrame {/**-* @author wanglong-* @description JfreeChart+ChartPanel实时曲线图* @param args-*/private TrayIcon trayIcon;TimeSeries ts,ts2;public static void main(String[] args) {// TODO Auto-generated method stub-new TEST4();}public TEST4(){jbinit();}public void jbinit(){this.getContentPane().setLayout(null);this.setSize(600,400);this.setResizable(false);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);//设置默认的关闭窗口的方式MyTray();MyAction();MyChart();StartThread();this.show();}public void MyChart(){ts=new TimeSeries("温度",Millisecond.class);ts2=new TimeSeries("湿度",Millisecond.class);TimeSeriesCollection tsc=new TimeSeriesCollection();tsc.addSeries(ts);tsc.addSeries(ts2);JFreeChart jfChart=ChartFactory.createTimeSeriesChart("实时曲线图","时间", "数值", tsc, true, true, true);TextTitle subTitle=new TextTitle(String.valueOf(Calendar.getInstance().get(Calendar.YEAR))+"年份");jfChart.addSubtitle(subTitle);//设置子标题XYPlot xyPlot=(XYPlot)jfChart.getPlot();xyPlot.setDomainGridlinePaint(Color.red);//设置竖网格颜色xyPlot.setRangeGridlinePaint(Color.orange);//设置横网格颜色ValueAxis vx=xyPlot.getDomainAxis();//vx.setRange(0.0D,2000D);//设置Y轴范围//坐标轴标尺值字体//vx.setTickLabelFont(new Font("Serif",Font.CENTER_BASELINE,13));-//vx.setLabelFont(new Font("Serif",Font.CENTER_BASELINE,15));-//纵坐标间距设置//vx.setTickUnit(new NumberTickUnit(20));-vx.setAutoRange(true);XYLineAndShapeRenderer xr=(XYLineAndShapeRenderer)xyPlot.getRenderer();xr.setSeriesPaint(0, Color.blue);//设置线的颜色xr.setSeriesPaint(1, Color.green);xr.setBaseShapesVisible(true);//显示线上各个数据点//显示数据点上的数据值xr.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());xr.setBasePositiveItemLabelPosition(newItemLabelPosition(ItemLabelAnchor.OUTSIDE12,TextAnchor.BASELINE_RIGHT));xr.setBaseItemLabelsVisible(true);ChartPanel cp=new ChartPanel(jfChart);cp.setSize(new Dimension(550,350));this.getContentPane().add(cp);}public void StartThread(){DataThread dt=new DataThread();dt.start();}public void MyAction(){this.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e) {int result=JOptionPane.showConfirmDialog(null, "确定要退出吗?","退出",JOptionPane.OK_CANCEL_OPTION);if(result==JOptionPane.OK_OPTION){System.exit(0);}}public void windowIconified(WindowEvent e){if(SystemTray.isSupported()){setVisible(false);SystemTray st=SystemTray.getSystemTray();try {st.add(trayIcon);//添加系统托盘} catch (AWTException e1) {// TODO Auto-generated catch block-e1.printStackTrace();}}}});}public void MyTray(){PopupMenu pm=new PopupMenu();MenuItem showItem=new MenuItem("SHOW");MenuItem exitItem=new MenuItem("EXIT");pm.add(showItem);pm.add(exitItem);Image image = Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource("wap.jpg"));trayIcon=new TrayIcon(image,"chart test",pm);showItem.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stub-setVisible(true);setExtendedState(Frame.NORMAL);SystemTray.getSystemTray().remove(trayIcon);//移除系统托盘}});exitItem.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){int result=JOptionPane.showConfirmDialog(null, "确实要退出吗?","退出",JOptionPane.OK_CANCEL_OPTION);if(result==JOptionPane.OK_OPTION){System.exit(0);}}});}class DataThread extends Thread{public void run(){while(true){Millisecond ms=new Millisecond();ts.add(ms,new Random().nextInt(500)); ts2.add(ms,new Random().nextInt(500)); try {this.sleep(30000);} catch (InterruptedException e) {// TODO Auto-generated catch block-e.printStackTrace();}}} } }。