Случайные ошибки при смене серии с использованием JFreeChart

Я делаю графический интерфейс, который отображает результат фоновых вычислений. Но перед этим я хотел проверить изменение набора данных. Вот мой код:

 DefaultXYDataset dataset = new DefaultXYDataset();
@Override
        public void run() {
                // TODO Auto-generated method stub
                for (int i = 0; i < periods; i++) {
                        series[0][i] = (double) i;
                        series[1][i] = 0;
                }
                dataset.addSeries("Series0", series);
                for (int it = 0; it < 10; it++) {
                        series[1][random.nextInt(periods)] =  random.nextInt(100) / 2;
                        double[][] d = new double[2][periods];
                        for (int i = 0; i < periods; i++) {
                                d[0][i] = series[0][i];
                                d[1][i] = series[1][i];
                        }
                        dataset.removeSeries("Series0");
                        dataset.addSeries("Series0", series);
//                      try {
//                              Thread.sleep(100);
//                      } catch (java.lang.InterruptedException ex) {
//                      }
                }

Как видите, я хочу изменить точки на графике (каждый раз, когда он завершает "некоторые сложные вычисления") - это изменение в потоке, вызванном мной в другом классе. Моя проблема в том, что вся эта концепция не работает. Он выбрасывает "Индекс серии за пределами" -IllegalArgumentException, "Индекс за пределами" - некоторого внутреннего массива библиотеки и т. Д. Я не использую DynamicTimeSeriesCollection, потому что мне нужно, чтобы ось X была числом моих внутренних итераций, а не временем период, а также обновлять, когда "некоторые вычисления" завершаются не каждые несколько периодов времени. Можете ли вы сказать мне, что я делаю не так? Или есть лучший способ обновить / обновить график?

1 ответ

Решение

Ваш фрагмент неправильно синхронизирован; вы должны обновить свой dataset от process() метод SwingWorker, как показано здесь. Вместо DateAxis, использовать NumberAxis, как показано в ChartFactory.createXYLineChart(),

Приложение: этот вариант приведенного примера отображает прогресс работника на линейном графике. Обратите внимание, что createXYLineChart() использования NumberAxis как для домена, так и для диапазона.

private XYSeriesCollection collection = new XYSeriesCollection();
private XYSeries series = new XYSeries("Result");
...
collection.addSeries(series);
JFreeChart chart = ChartFactory.createXYLineChart(
    "Newton's Method", "X", "Y", collection,
    PlotOrientation.VERTICAL, false, true, false);
XYPlot plot = (XYPlot) chart.getPlot();
plot.getRangeAxis().setRange(1.4, 1.51);
plot.getDomainAxis().setStandardTickUnits(
    NumberAxis.createIntegerTickUnits());
XYLineAndShapeRenderer renderer =
    (XYLineAndShapeRenderer) plot.getRenderer();
renderer.setSeriesShapesVisible(0, true);
this.add(new ChartPanel(chart), BorderLayout.CENTER);
...
private int n;
@Override
protected void process(List<Double> chunks) {
    for (double d : chunks) {
        label.setText(df.format(d));
        series.add(++n, d);
    }
}
Другие вопросы по тегам