繁体   English   中英

如何每5秒将数据添加到JFree XY图表中?

[英]How to add data into a JFree XY chart every 5 seconds?

该图当前的外观

我可以访问一个数据库,该数据库每5秒返回一个位置的温度和该位置的时间。
我有一个在x轴上绘制时间的想法。
也许通过使用Java swing Timer,我将能够每5秒将数据添加到图形中。
但是,我不知道如何实现它,因为我考虑在createDataset()中添加一个计时器,但是由于它返回了一个数据集,所以我将无法实现它。
知道如何每5秒将数据添加到图形中吗?
这是我的代码:

import java.awt.Color; 
import java.awt.BasicStroke; 

import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.ui.ApplicationFrame; 
import org.jfree.ui.RefineryUtilities; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.data.xy.XYSeriesCollection; 
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;

public class XYLineChart_AWT extends ApplicationFrame {

public XYLineChart_AWT( String applicationTitle, String chartTitle ) {
  super(applicationTitle);
  JFreeChart xylineChart = ChartFactory.createXYLineChart(
     chartTitle ,
     "Time" ,
     "Temperature" ,
     createDataset() ,
     PlotOrientation.VERTICAL ,
     true , true , false);

  ChartPanel chartPanel = new ChartPanel( xylineChart );
  chartPanel.setPreferredSize( new java.awt.Dimension( 560 , 367 ) );
  final XYPlot plot = xylineChart.getXYPlot( );

  XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer( );
  renderer.setSeriesPaint( 0 , Color.RED );
  renderer.setSeriesStroke( 0 , new BasicStroke( 4.0f ) );
  plot.setRenderer( renderer ); 
  setContentPane( chartPanel ); 
}

private XYDataset createDataset( ) {
  final XYSeries temp = new XYSeries( "Temperature" );  
  //time = getTime(); //returns a float time in seconds.milliseconds
  //temperature = getTemp(); //returns a number temperature 
  //I want to add data into temp every 5 seconds but i don't know how to do it        
  temp.add( 1.0 , 1.0 );          
  temp.add( 2.0 , 4.0 );          
  temp.add( 3.0 , 3.0 );                  

  final XYSeriesCollection dataset = new XYSeriesCollection( );          
  dataset.addSeries( temp );
  return dataset;
}

public static void main( String[ ] args ) {
  XYLineChart_AWT chart = new XYLineChart_AWT("Temp",
     "Temperature of some location");
  chart.pack( );          
  RefineryUtilities.centerFrameOnScreen( chart );          
  chart.setVisible( true ); 
}
}

与其在您的createDataset()方法中放置一个计时器,不如从您的main方法中生成一个新线程,该线程每5秒修改一次JFreeChart数据集。

例如,您可以执行以下操作:

public static void main( String[ ] args ) {
  XYLineChart_AWT chart = new XYLineChart_AWT("Temp",
     "Temperature of some location");
  chart.pack( );          
  RefineryUtilities.centerFrameOnScreen( chart );          
  chart.setVisible( true ); 

  //now make your timer
  int delay = 5000; //milliseconds
  ActionListener timerAction = new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
          //some code here to get and modify your dataset so it can be updated
          // ----
          // ----
          //now apply your new dataset to your JFreeChart
          xylineChart.getXYPlot().setDataset(myNewDataset);
      }
  };
  new Timer(delay, timerAction).start();
}

请记住添加一些代码以删除数据集中的旧条目,以使图表保持可读性,并且时间轴上的所有值在不同数据集之间保持相同的距离,例如,确保不超过24个项目(2分钟数据)一次绘制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM