2011-02-19 37 views

回答

15

您也可以消除第一advanceTime(零),然後appendData。 (在示例中交換他們正在做的事情)。

42

JFreeChartDynamicTimeSeriesCollection是一個不錯的選擇。

附錄:正如@Bahadır指出,該系列的最後一點是持續零。 @Don有用地建議提前時間,然後然後附加數據。

dataset.advanceTime(); 
dataset.appendData(newData); 

enter image description here

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.axis.ValueAxis; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.data.time.DynamicTimeSeriesCollection; 
import org.jfree.data.time.Second; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.ui.ApplicationFrame; 
import org.jfree.ui.RefineryUtilities; 

/** @see http://stackoverflow.com/questions/5048852 */ 
public class DTSCTest extends ApplicationFrame { 

    private static final String TITLE = "Dynamic Series"; 
    private static final String START = "Start"; 
    private static final String STOP = "Stop"; 
    private static final float MINMAX = 100; 
    private static final int COUNT = 2 * 60; 
    private static final int FAST = 100; 
    private static final int SLOW = FAST * 5; 
    private static final Random random = new Random(); 
    private Timer timer; 

    public DTSCTest(final String title) { 
     super(title); 
     final DynamicTimeSeriesCollection dataset = 
      new DynamicTimeSeriesCollection(1, COUNT, new Second()); 
     dataset.setTimeBase(new Second(0, 0, 0, 1, 1, 2011)); 
     dataset.addSeries(gaussianData(), 0, "Gaussian data"); 
     JFreeChart chart = createChart(dataset); 

     final JButton run = new JButton(STOP); 
     run.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       String cmd = e.getActionCommand(); 
       if (STOP.equals(cmd)) { 
        timer.stop(); 
        run.setText(START); 
       } else { 
        timer.start(); 
        run.setText(STOP); 
       } 
      } 
     }); 

     final JComboBox combo = new JComboBox(); 
     combo.addItem("Fast"); 
     combo.addItem("Slow"); 
     combo.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       if ("Fast".equals(combo.getSelectedItem())) { 
        timer.setDelay(FAST); 
       } else { 
        timer.setDelay(SLOW); 
       } 
      } 
     }); 

     this.add(new ChartPanel(chart), BorderLayout.CENTER); 
     JPanel btnPanel = new JPanel(new FlowLayout()); 
     btnPanel.add(run); 
     btnPanel.add(combo); 
     this.add(btnPanel, BorderLayout.SOUTH); 

     timer = new Timer(FAST, new ActionListener() { 

      float[] newData = new float[1]; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       newData[0] = randomValue(); 
       dataset.advanceTime(); 
       dataset.appendData(newData); 
      } 
     }); 
    } 

    private float randomValue() { 
     return (float) (random.nextGaussian() * MINMAX/3); 
    } 

    private float[] gaussianData() { 
     float[] a = new float[COUNT]; 
     for (int i = 0; i < a.length; i++) { 
      a[i] = randomValue(); 
     } 
     return a; 
    } 

    private JFreeChart createChart(final XYDataset dataset) { 
     final JFreeChart result = ChartFactory.createTimeSeriesChart(
      TITLE, "hh:mm:ss", "milliVolts", dataset, true, true, false); 
     final XYPlot plot = result.getXYPlot(); 
     ValueAxis domain = plot.getDomainAxis(); 
     domain.setAutoRange(true); 
     ValueAxis range = plot.getRangeAxis(); 
     range.setRange(-MINMAX, MINMAX); 
     return result; 
    } 

    public void start() { 
     timer.start(); 
    } 

    public static void main(final String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       DTSCTest demo = new DTSCTest(TITLE); 
       demo.pack(); 
       RefineryUtilities.centerFrameOnScreen(demo); 
       demo.setVisible(true); 
       demo.start(); 
      } 
     }); 
    } 
} 
+0

感謝這個偉大的樣本:

private TimeSeriesCollection dataset; private TimeSeries sensorSeries; sensorSeries = new TimeSeries("name", Minute.class); sensorSeries.setMaximumItemAge(60); dataset = new TimeSeriesCollection(); dataset.addSeries(sensorSeries); 

..和你會它帶有添加數據。你知道一種方法來防止線路的最後一點爲零嗎? – 2011-04-28 13:29:09

+0

@Bahadır:它似乎是`advanceTime()`的有意效果。我從來沒有用過不同的基線值。有什麼想法嗎?不要忘記提高你認爲有用的答案。 :-) – trashgod 2011-04-28 16:30:56

+0

「你上次投票在本回答四月25在13:11」我總是這樣做。順便說一句,我通過使用TimeSeriesCollection而不是動態的來修復這個問題。然後用add添加dataset.appendData,並設置數據集的生存時間。它提供了幾乎相同的功能。 – 2011-04-28 20:21:48

7

@ thrashgod的答案的另一種方法是使用TimeSeriesCollection並在TimeSeries上設置項目的年齡。下面的代碼可以設置圖形以1分鐘的間隔顯示最近1小時的數據。

sensorSeries.add(new Minute(new Date()), newData);