java – JFreeChart – 如何在TimeSeries图表的X轴上显示实时
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – JFreeChart – 如何在TimeSeries图表的X轴上显示实时,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4007字,纯文字阅读大概需要6分钟。
内容图文
![java – JFreeChart – 如何在TimeSeries图表的X轴上显示实时](/upload/InfoBanner/zyjiaocheng/710/1ddfbfeefced43c39736a7120c512fea.jpg)
我想在TimeSeries图表上显示实时数据,实时显示在x轴上(或者至少具有与实时相同的时间速度).
这是一个问题的SSCCE,随机数作为实时输入. x轴上显示的时间比实时快得多(假设它以hh:mm:ss格式显示):
public class DynamicTimeSeriesChart extends JPanel {
private DynamicTimeSeriesCollection dataset;
private JFreeChart chart = null;
public DynamicTimeSeriesChart(final String title) {
dataset = new DynamicTimeSeriesCollection(1, 2000, new Second());
dataset.setTimeBase(new Second(0, 0, 0, 1, 1, 1990)); // date 1st jan 0 mins 0 secs
dataset.addSeries(new float[1], 0, title);
chart = ChartFactory.createTimeSeriesChart(
title, "Time", title, dataset, true,
true, false);
final XYPlot plot = chart.getXYPlot();
ValueAxis axis = plot.getDomainAxis();
axis.setAutoRange(true);
axis.setFixedAutoRange(200000); // proportional to scroll speed
axis = plot.getRangeAxis();
final ChartPanel chartPanel = new ChartPanel(chart);
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
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) {
JFrame frame = new JFrame("testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final DynamicTimeSeriesChart chart = new DynamicTimeSeriesChart("random numbers");
frame.add(chart);
frame.pack();
frame.setVisible(true);
Timer timer = new Timer(100, new ActionListener() {
public void actionPerformed(ActionEvent e) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
chart.update((float) (Math.random() * 10));
}
});
}
});
timer.start();
}
}
解决方法:
虽然initial thread上的sleep()是可以接受的,但是应该仅在事件派发线程上构造和操作Swing GUI对象.相反,使用javax.swing.Timer来调整更新速度,如here所示.延迟100 ms将以大约10 Hz的速度更新.
如果漂移是不可接受的,则以另一个线程以标称速率的一半轮询主机的时钟,并使用EventQueue.invokeLater()更新数据集.确保主机已同步到NTP服务器.
附录:根据您的更新,请注意所有Swing GUI对象必须仅在事件派发线程上构建和操作,而不仅仅是javax.swing.Timer. Swing Timer的优势在于它在EDT上触发.下面的变化显示近似实时的10秒1 Hz数据.
附录:您可以调整传递给setTimeBase()的时间,如here所示.
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);
}
});
}
}
内容总结
以上是互联网集市为您收集整理的java – JFreeChart – 如何在TimeSeries图表的X轴上显示实时全部内容,希望文章能够帮你解决java – JFreeChart – 如何在TimeSeries图表的X轴上显示实时所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。