JFreeChart - How to show real-time on the X-Axis of a TimeSeries chart

前端 未结 1 1536
南方客
南方客 2020-12-03 20:17

I want to show live data on a TimeSeries chart with real time shown on the x-axis (or at least have the speed of the time the same as real-time).

H

相关标签:
1条回答
  • While it is acceptable to sleep() on the initial thread, Swing GUI objects should be constructed and manipulated only on the event dispatch thread. Instead, use a javax.swing.Timer to pace the updates, as shown here. A delay of 100 ms will update at approximately 10 Hz.

    If the drift is unacceptable, poll the host's clock from another thread at half the nominal rate and update the dataset using EventQueue.invokeLater(). Ensure that the host is synchronized to an NTP server.

    Addendum: Based on your update, note that all Swing GUI objects must be constructed and manipulated only on the event dispatch thread, not just the javax.swing.Timer. The advantage of a Swing Timer is that it fires on the EDT. The variation below shows 10 seconds of 1 Hz data at approximately real time.

    Addendum: You can adjust the time passed to setTimeBase() as shown here.

    image

    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.text.SimpleDateFormat;
    import javax.swing.JFrame;
    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.DateAxis;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.data.time.DynamicTimeSeriesCollection;
    import org.jfree.data.time.Second;
    
    /**
     * @see https://stackoverflow.com/a/21307289/230513
     */
    public class DynamicTimeSeriesChart extends JPanel {
    
        private final DynamicTimeSeriesCollection dataset;
        private final JFreeChart chart;
    
        public DynamicTimeSeriesChart(final String title) {
            dataset = new DynamicTimeSeriesCollection(1, 1000, new Second());
            dataset.setTimeBase(new Second(0, 0, 0, 23, 1, 2014));
            dataset.addSeries(new float[1], 0, title);
            chart = ChartFactory.createTimeSeriesChart(
                title, "Time", title, dataset, true, true, false);
            final XYPlot plot = chart.getXYPlot();
            DateAxis axis = (DateAxis) plot.getDomainAxis();
            axis.setFixedAutoRange(10000);
            axis.setDateFormatOverride(new SimpleDateFormat("ss.SS"));
            final ChartPanel chartPanel = new ChartPanel(chart);
            add(chartPanel);
        }
    
        public void update(float value) {
            float[] newData = new float[1];
            newData[0] = value;
            dataset.advanceTime();
            dataset.appendData(newData);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    JFrame frame = new JFrame("testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    final DynamicTimeSeriesChart chart
                        = new DynamicTimeSeriesChart("Alternating data");
                    frame.add(chart);
                    frame.pack();
                    Timer timer = new Timer(1000, new ActionListener() {
                        private boolean b;
    
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            chart.update(b ? 1 : 0);
                            b = !b;
                        }
                    });
                    timer.start();
                    frame.setVisible(true);
                }
            });
        }
    }
    
    0 讨论(0)
提交回复
热议问题