2013-06-01 3 views
3

У меня есть диаграмма JFreeChart, которая отображает измерения с датчика. Диаграмма должна показать, как эти значения меняются со временем.Как фиксировать диапазон доменов диаграммы JFreeChart XY?

создать диаграмму, используя следующий код:

// create the chart... 
    final JFreeChart chart = ChartFactory.createXYLineChart(
     "Pulse sensor data",  // chart title 
     "X",      // x axis label 
     "Y",      // y axis label 
     dataset,     // data 
     PlotOrientation.VERTICAL, 
     true,      // include legend 
     true,      // tooltips 
     false      // urls 
    ); 

    // NOW DO SOME OPTIONAL CUSTOMISATION OF THE CHART... 
    chart.setBackgroundPaint(Color.white); 


    // get a reference to the plot for further customisation... 
    final XYPlot plot = chart.getXYPlot(); 
    plot.setBackgroundPaint(Color.lightGray); 
    plot.setDomainGridlinePaint(Color.white); 
    plot.setRangeGridlinePaint(Color.white); 

    final XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(); 

    renderer.setDrawSeriesLineAsPath(true); 

    renderer.setSeriesLinesVisible(0, true); 
    renderer.setSeriesShapesVisible(0, false); 
    plot.setRenderer(renderer); 

    // change the auto tick unit selection to integer units only... 
    final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); 
    rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); 

Существует проблема с этой реализацией - ось домена постоянно меняется, следовательно, представление изменений сигналов, а также. Поэтому трудно сказать визуально, изменился ли сигнал значительно.

В начале сеанса измерения область находится в диапазоне от 0 до прибл. 550.

enter image description here

Через некоторое время я получаю больше данных и теперь максимальное значение составляет 35000.

enter image description here

Если мы будем ждать дольше, это еще раз (на самом деле меняется, с каждым полученных измерений литле).

enter image description here

Как я могу изменить код таким образом, что диаграмма показывает измерения последней X (т. Е. Размер оси области остается константа) и вид скользит по времени?

Обновление 1 (01.06.2013 18:06 MSK): Я изменил код для добавления нового элемента данных

sensorSeries.add(new Millisecond(new Date()), voltage); 

, где voltage это новое значение датчика.

Код для создания диаграммы также изменилась:

dataset = new TimeSeriesCollection(); 

sensorSeries = new TimeSeries("Pulse sensor data"); 
sensorSeries.setMaximumItemAge(12500); 

dataset.addSeries(sensorSeries); 

final JFreeChart chart = createChart(dataset); 

[...] 

private JFreeChart createChart(final XYDataset dataset) {   
    // create the chart...    
    final JFreeChart chart = ChartFactory.createTimeSeriesChart(
     "Pulse sensor data",  // chart title 
     "X",      // x axis label 
     "Y",      // y axis label 
     dataset,     // data 
     true,      // include legend 
     true,      // tooltips 
     false      // urls 
    ); 

    final XYPlot plot = chart.getXYPlot(); 
    ValueAxis domain = plot.getDomainAxis(); 
    domain.setAutoRange(true);   

    final ValueAxis rangeAxis = plot.getRangeAxis(); 
    rangeAxis.setAutoRange(true); 

    return chart; 
} 

Это работает отлично, за исключением, что иногда я получаю следующее исключение:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1201, Size: 1201 
    at java.util.ArrayList.RangeCheck(Unknown Source) 
    at java.util.ArrayList.get(Unknown Source) 
    at org.jfree.data.time.TimeSeries.getRawDataItem(TimeSeries.java:422) 
    at org.jfree.data.time.TimeSeries.getTimePeriod(TimeSeries.java:454) 
    at org.jfree.data.time.TimeSeriesCollection.getXValue(TimeSeriesCollection.java:428) 
    at org.jfree.chart.renderer.xy.XYLineAndShapeRenderer.drawPrimaryLine(XYLineAndShapeRenderer.java:987) 
    at org.jfree.chart.renderer.xy.XYLineAndShapeRenderer.drawItem(XYLineAndShapeRenderer.java:913) 
    at org.jfree.chart.plot.XYPlot.render(XYPlot.java:3828) 
    at org.jfree.chart.plot.XYPlot.draw(XYPlot.java:3389) 
    at org.jfree.chart.JFreeChart.draw(JFreeChart.java:1237) 
    at org.jfree.chart.ChartPanel.paintComponent(ChartPanel.java:1672) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JComponent.paintToOffscreen(Unknown Source) 

Любые идеи, как это исправить?

+1

Смотрите также [* Использование JFreeChart для отображения последних изменений в временном ряде *] (http://stackoverflow.com/q/5048852/230513). – trashgod

+0

@trashgod Спасибо. См. Мое обновление 1. –

+0

Что-то, что происходит _sometimes_, всегда заставляет меня думать о неправильной синхронизации; убедитесь, что вы обновляете модель (набор данных) в [потоке рассылки событий] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). – trashgod

ответ

1

Как я могу выполнить добавление данных в потоке отправки событий?

Как показано here, SwingWorker идеально подходит для этого. Опрос или прослушивание источника данных в методе рабочего doInBackground() и обновление модели диаграммы в process(), которая выполняется в потоке отправки событий.

image

Смежные вопросы