如何每 10 秒更新一次 JFreeChart TimeSeries 图表?
How do I update my JFreeChart TimeSeries chart every 10 seconds?
基于此example,我想每 10 秒更新一次我的时间序列图表。但是,如果我使用 swing Timer
使图表每 10 秒更新一次,图表上显示它仅在 1 秒内更新了自己,即使经过的时间是 10 秒。这是我的变体,它基本上每 10 秒从在线数据库的某个位置获取最新温度,并(尝试)将其绘制在图表上:
/** @see */
public class l extends ApplicationFrame {
TestWeatherTimeLapseService getTemp = new TestWeatherTimeLapseService(); //gets temperature
private static final String TITLE = "Dynamic Series";
private static final int COUNT = 1 ;
private static final int DELAY = 10000;
private Timer timer;
public l(final String title) {
super(title);
final DynamicTimeSeriesCollection dataset =
new DynamicTimeSeriesCollection(1,60, new Second());
Date date = new Date();
dataset.setTimeBase(new Second(date));
dataset.addSeries(gaussianData(), 0, "Gaussian data");
JFreeChart chart = createChart(dataset);
this.add(new ChartPanel(chart), BorderLayout.CENTER);
timer = new Timer(DELAY, new ActionListener() {
float[] newData = new float[1];
@Override
public void actionPerformed(ActionEvent e) {
newData[0] = randomValue();
dataset.advanceTime();
dataset.appendData(newData);
}
});
}
private float randomValue() {
String currTemperature="";
try {
currTemperature=getTemp.getWeatherData("Laverton")[1]; //get temperature of laverton
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
float number = Float.parseFloat(currTemperature);
number=(float) (number-273.15);
return number;
}
private float[] gaussianData() {
float[] a = new float[COUNT];
a[0] = randomValue();
return a;
}
private JFreeChart createChart(final XYDataset dataset) {
final JFreeChart result = ChartFactory.createTimeSeriesChart(
TITLE, "time", "milliVolts", dataset, true, true, false);
final XYPlot plot = result.getXYPlot();
ValueAxis domain = plot.getDomainAxis();
domain.setAutoRange(true);
ValueAxis range = plot.getRangeAxis();
DateAxis axis = (DateAxis) plot.getDomainAxis();
axis.setTickUnit(new DateTickUnit(DateTickUnitType.SECOND, 5));
axis.setDateFormatOverride(new SimpleDateFormat("mm:ss"));
range.setRange(-10,50);
return result;
}
public void start() {
timer.start();
}
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
l demo = new l(TITLE);
demo.pack();
RefineryUtilities.centerFrameOnScreen(demo);
demo.setVisible(true);
// Run some code;
demo.start();
}
});
}}
您的 DynamicTimeSeriesCollection
constructor specified 60 moments, each of one Second
duration. As a result, each call to advanceTime()
moves the time by one second. One approach is to invoke advanceTime()
to match your next reading. Starting from the original example,以下更改会产生以 10 秒为间隔显示的效果:
@Override
public void actionPerformed(ActionEvent e) {
newData[0] = randomValue();
for (int i = 0; i < 10; i++) {
dataset.advanceTime();
dataset.appendData(newData);
}
}
另请参阅 setTimeBase()
中关于系列初始化的相关 。例如,此 gaussianData()
的实现在前 COUNT
秒内每 10 秒更改一次数据。
private float[] gaussianData() {
float[] a = new float[COUNT];
for (int i = 0; i < a.length; i++) {
if (i % 10 == 0) a[i] = randomValue();
}
return a;
}
基于此example,我想每 10 秒更新一次我的时间序列图表。但是,如果我使用 swing Timer
使图表每 10 秒更新一次,图表上显示它仅在 1 秒内更新了自己,即使经过的时间是 10 秒。这是我的变体,它基本上每 10 秒从在线数据库的某个位置获取最新温度,并(尝试)将其绘制在图表上:
/** @see */
public class l extends ApplicationFrame {
TestWeatherTimeLapseService getTemp = new TestWeatherTimeLapseService(); //gets temperature
private static final String TITLE = "Dynamic Series";
private static final int COUNT = 1 ;
private static final int DELAY = 10000;
private Timer timer;
public l(final String title) {
super(title);
final DynamicTimeSeriesCollection dataset =
new DynamicTimeSeriesCollection(1,60, new Second());
Date date = new Date();
dataset.setTimeBase(new Second(date));
dataset.addSeries(gaussianData(), 0, "Gaussian data");
JFreeChart chart = createChart(dataset);
this.add(new ChartPanel(chart), BorderLayout.CENTER);
timer = new Timer(DELAY, new ActionListener() {
float[] newData = new float[1];
@Override
public void actionPerformed(ActionEvent e) {
newData[0] = randomValue();
dataset.advanceTime();
dataset.appendData(newData);
}
});
}
private float randomValue() {
String currTemperature="";
try {
currTemperature=getTemp.getWeatherData("Laverton")[1]; //get temperature of laverton
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
float number = Float.parseFloat(currTemperature);
number=(float) (number-273.15);
return number;
}
private float[] gaussianData() {
float[] a = new float[COUNT];
a[0] = randomValue();
return a;
}
private JFreeChart createChart(final XYDataset dataset) {
final JFreeChart result = ChartFactory.createTimeSeriesChart(
TITLE, "time", "milliVolts", dataset, true, true, false);
final XYPlot plot = result.getXYPlot();
ValueAxis domain = plot.getDomainAxis();
domain.setAutoRange(true);
ValueAxis range = plot.getRangeAxis();
DateAxis axis = (DateAxis) plot.getDomainAxis();
axis.setTickUnit(new DateTickUnit(DateTickUnitType.SECOND, 5));
axis.setDateFormatOverride(new SimpleDateFormat("mm:ss"));
range.setRange(-10,50);
return result;
}
public void start() {
timer.start();
}
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
l demo = new l(TITLE);
demo.pack();
RefineryUtilities.centerFrameOnScreen(demo);
demo.setVisible(true);
// Run some code;
demo.start();
}
});
}}
您的 DynamicTimeSeriesCollection
constructor specified 60 moments, each of one Second
duration. As a result, each call to advanceTime()
moves the time by one second. One approach is to invoke advanceTime()
to match your next reading. Starting from the original example,以下更改会产生以 10 秒为间隔显示的效果:
@Override
public void actionPerformed(ActionEvent e) {
newData[0] = randomValue();
for (int i = 0; i < 10; i++) {
dataset.advanceTime();
dataset.appendData(newData);
}
}
另请参阅 setTimeBase()
中关于系列初始化的相关 gaussianData()
的实现在前 COUNT
秒内每 10 秒更改一次数据。
private float[] gaussianData() {
float[] a = new float[COUNT];
for (int i = 0; i < a.length; i++) {
if (i % 10 == 0) a[i] = randomValue();
}
return a;
}