簡體   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