Случайные ошибки при смене серии с использованием 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, "index out of bounds" - некоторого внутреннего библиотекаря библиотеки и т.д. Я не использую DynamicTimeSeriesCollection, потому что мне нужна ось X, чтобы быть числом моих внутренних итераций, а не временем период, а также обновлять, когда "некоторые вычисления" завершаются не каждый промежуток времени. Можете ли вы сказать мне, что я делаю неправильно? Или есть лучший способ обновить/обновить график?
Ответы
Ответ 1
Ваш фрагмент неправильно синхронизирован; вы должны обновить dataset
из process()
метода SwingWorker
, как показано здесь. Вместо DateAxis
используйте NumberAxis
, как показано в ChartFactory.createXYLineChart()
.
Приложение: Этот вариант на примере, приведенном в примере, указывает на прогресс работника на линейной диаграмме. Обратите внимание, что createXYLineChart()
использует NumberAxis
для домена и диапазона.
![enter image description here]()
private XYSeriesCollection collection = new XYSeriesCollection();
private XYSeries series = new XYSeries("Result");
...
collection.addSeries(series);
JFreeChart chart = ChartFactory.createXYLineChart(
"Newton 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);
}
}