3

センサーからの測定値を表示する JFreeChart チャートがあります。ダイアグラムは、これらの値が時間とともにどのように変化するかを示す必要があります。

次のコードを使用して図を作成します。

    // 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 から約 1 です。550。

ここに画像の説明を入力

しばらくしてさらにデータを取得すると、最大値は 35000 になりました。

ここに画像の説明を入力

より長く待つと、再び変化します (実際には、受信した測定値ごとに少しずつ)。

ここに画像の説明を入力

ダイアグラムが最後の 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)

それを修正する方法はありますか?

4

1 に答える 1

1

イベントディスパッチスレッドにデータを追加するにはどうすればよいですか?

ここに示すように、SwingWorkerはこれに最適です。ワーカーのメソッドでデータ ソースをポーリングまたはリッスンし、イベント ディスパッチ スレッドで実行される でdoInBackground()チャートのモデルを更新します。process()

画像

于 2013-06-01T17:55:47.823 に答える