论坛首页 Java企业应用论坛

JFreeChart实现实时曲线图

浏览 42234 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-08-14  
OO
        最近要用到实时曲线图,在网上大概找了一下,有两种实现方式,一种就是JFreeChart的官方实例MemoryUsageDemo.java.通过一个实现java.Swing.Timer的内部类,在其监听器中将实时数据添加进TimeSeries,由于Timer是会实时执行的,所以这个方法倒是没有什么问题,可以参考代码。
      另一种方式就是将实时类实现Runnable接口,在其run()方法中,通过无限循环将实时数据添加进TimeSeries,下面是较简单的实现代码:
java 代码
 
  1. //RealTimeChart .java  
  2. import org.jfree.chart.ChartFactory;  
  3. import org.jfree.chart.ChartPanel;  
  4. import org.jfree.chart.JFreeChart;  
  5. import org.jfree.chart.axis.ValueAxis;  
  6. import org.jfree.chart.plot.XYPlot;  
  7. import org.jfree.data.time.Millisecond;  
  8. import org.jfree.data.time.TimeSeries;  
  9. import org.jfree.data.time.TimeSeriesCollection;  
  10.   
  11. public class RealTimeChart extends ChartPanel implements Runnable  
  12. {  
  13.     private static TimeSeries timeSeries;  
  14.     private long value=0;  
  15.       
  16.     public RealTimeChart(String chartContent,String title,String yaxisName)  
  17.     {  
  18.         super(createChart(chartContent,title,yaxisName));  
  19.     }  
  20.       
  21.     private static JFreeChart createChart(String chartContent,String title,String yaxisName){  
  22.         //创建时序图对象  
  23.         timeSeries = new TimeSeries(chartContent,Millisecond.class);  
  24.         TimeSeriesCollection timeseriescollection = new TimeSeriesCollection(timeSeries);  
  25.         JFreeChart jfreechart = ChartFactory.createTimeSeriesChart(title,"时间(秒)",yaxisName,timeseriescollection,true,true,false);  
  26.         XYPlot xyplot = jfreechart.getXYPlot();  
  27.         //纵坐标设定  
  28.         ValueAxis valueaxis = xyplot.getDomainAxis();  
  29.         //自动设置数据轴数据范围  
  30.         valueaxis.setAutoRange(true);  
  31.         //数据轴固定数据范围 30s  
  32.         valueaxis.setFixedAutoRange(30000D);  
  33.   
  34.         valueaxis = xyplot.getRangeAxis();  
  35.         //valueaxis.setRange(0.0D,200D);  
  36.   
  37.         return jfreechart;  
  38.       }  
  39.   
  40.     public void run()  
  41.     {  
  42.         while(true)  
  43.         {  
  44.         try  
  45.         {  
  46.             timeSeries.add(new Millisecond(), randomNum());  
  47.             Thread.sleep(300);  
  48.         }  
  49.         catch (InterruptedException e)  {   }  
  50.         }         
  51.     }  
  52.       
  53.     private long randomNum()  
  54.     {     
  55.         System.out.println((Math.random()*20+80));        
  56.         return (long)(Math.random()*20+80);  
  57.     }  
  58. }  
  59.   
  60. //Test.java  
  61. import java.awt.BorderLayout;  
  62. import java.awt.event.WindowAdapter;  
  63. import java.awt.event.WindowEvent;  
  64. import javax.swing.JFrame;  
  65.   
  66. public class Test  
  67. {  
  68.   
  69.     /** 
  70.      * @param args 
  71.      */  
  72.     public static void main(String[] args)  
  73.     {  
  74.     JFrame frame=new JFrame("Test Chart");  
  75.     RealTimeChart rtcp=new RealTimeChart("Random Data","随机数","数值");  
  76.     frame.getContentPane().add(rtcp,new BorderLayout().CENTER);  
  77.     frame.pack();  
  78.     frame.setVisible(true);  
  79.     (new Thread(rtcp)).start();  
  80.     frame.addWindowListener(new WindowAdapter()   
  81.     {  
  82.         public void windowClosing(WindowEvent windowevent)  
  83.         {  
  84.             System.exit(0);  
  85.         }  
  86.   
  87.     });  
  88.     }  
  89. }

          这两中方法都有一个问题,就是每实现一个图就要重新写一次,因为实时数据无法通过参数传进来,在想有没有可能通过setXXX()方式传进实时数据,那样的话就可以将实时曲线绘制类封装起来,而只需传递些参数即可(或者谁有更好的办法??)。
  • 描述: Test的运行结果
  • 大小: 35.8 KB
  • MemoryUsageDemo.rar (1.3 KB)
  • 描述: MemoryUsageDemo:JFreeChart1.0.6的官方实时曲线类
  • 下载次数: 3145
   发表时间:2007-08-15  
感觉flex chart, 实现起来更完美.
0 请登录后投票
   发表时间:2007-08-15  
galaxystar 写道
感觉flex chart, 实现起来更完美.
flex chart可以用于Swing中吗?没有用过flex...
1 请登录后投票
   发表时间:2007-08-31  
JFreeChart可以用在swt里面

对话框
和view都可用

我以前专门写过一个view用来显示报表

客户操作起来的感觉好像pdf
1 请登录后投票
   发表时间:2007-08-31  
我这几天也正在研究JfreeChart,哈哈
但是我想问,LZ有没有试过通过什么办法把它嵌入到网页中?
不知道applet能不能做到
0 请登录后投票
   发表时间:2007-08-31  
magice 写道
我这几天也正在研究JfreeChart,哈哈
但是我想问,LZ有没有试过通过什么办法把它嵌入到网页中?
不知道applet能不能做到
applet当然可以做到了,而且jfrre chart本来就是用于web开发的吧!
0 请登录后投票
   发表时间:2007-08-31  
robert02432004@126.com 写道
magice 写道
我这几天也正在研究JfreeChart,哈哈
但是我想问,LZ有没有试过通过什么办法把它嵌入到网页中?
不知道applet能不能做到
applet当然可以做到了,而且jfrre chart本来就是用于web开发的吧!
是可以直接用于web开发!
但是有点不好的就是web开发时只能输出静态图片,而图片是不能展示动态效果的(就像你给出的例子这种)
所以我就在想使用applet看行不行。

另外浏览器好像对applet的载入有安全限制,刚才我测试的时候,好像载入不到。。。
0 请登录后投票
   发表时间:2007-08-31  
jfreechart里面有个servlet类 你上网搜一下应该有很多例子
作为一个图片插入到网页中 但是要做到这种实时曲线那不行
0 请登录后投票
   发表时间:2007-08-31  
laiseeme 写道
jfreechart里面有个servlet类 你上网搜一下应该有很多例子
作为一个图片插入到网页中 但是要做到这种实时曲线那不行
没在网页中用过,不过ajax不就是用来干异步通信的吗?呵呵
0 请登录后投票
   发表时间:2007-08-31  
robert02432004@126.com 写道
laiseeme 写道
jfreechart里面有个servlet类 你上网搜一下应该有很多例子
作为一个图片插入到网页中 但是要做到这种实时曲线那不行
没在网页中用过,不过ajax不就是用来干异步通信的吗?呵呵
ajax的异步和实时曲线那是两码事。
实时曲线实际上是一个应用程序,而ajax简单来说是局部刷新,注意还是要刷新页面的,如果实时曲线使用ajax做,那么每秒至少刷新25次,事实上这是达不到的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics