2017-05-17 3 views
0

How the graph currently looks like5秒ごとにJFree XYチャートにデータを追加するには?

私は、その場所の場所と時間の温度を5秒ごとに返すデータベースにアクセスできます。
私は、x軸に時間をプロットする考えがあります。
おそらく、Javaスイングタイマーを使用すると、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); 
} 
} 

答えて

0

よりもむしろあなたの代わりにあなたはJFreeChartデータセットが5秒ごとに変更し、あなたの主な方法から、新しいスレッドを生成することができ、あなたのcreateDataset()方法でタイマーを置きます。

は、たとえば、あなたはこのようにそれに何かを行うことができます:チャートが読みやすいままで、時間軸上のすべての値が同じままとなるよう

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分分)がプロットされていないことを確認してください。

+0

ご回答いただきありがとうございますが、私はJFreeチャートを初めて使用していますので、上記で書いた正確なコードを使用しようとするとエラーになります。 http://i.imgur.com/hLxz3wg.png – fredjohnson

+1

あなたの 'XYSeriesCollection'の' XYSeries'にアイテムを 'add()'することもできます。 –

+0

私は自分のコードを変更しましたが、グラフに追加するのではなく、グラフを更新します。したがって、チャートには一度に1つのプロットしか含まれません。 https://pastebin.com/pfd2RY5r 5秒ごとにグラフを再作成するのではなく、代わりにどのように追加するのですか? – fredjohnson

関連する問題