У меня есть этот абстрактный класс для LineChart, ряды которого разбиты на несколько рядов, которые будут показывать только линии между точками данных и некоторые ряды, которые показывают только несколько точек данных без соединительных линий. Это делается с помощью CSS и работает нормально. (В конце поста есть ссылка на картинку.)
public abstract class GeneralChart<XType extends Number, YType extends Number> extends LineChart<XType, YType> {
protected final static int accuracyOfPlot = 1000;
protected LineSeries lineSeries;
protected PointSeries pointSeries;
GeneralChart(ValueAxis<XType> xTypeAxis, ValueAxis<YType> yTypeAxis, int numberOfLineSeries, int numberOfPointSeries) {
super(xTypeAxis, yTypeAxis);
lineSeries = new LineSeries(numberOfLineSeries); // Init Line Series
pointSeries = new PointSeries(numberOfPointSeries); // Init Point Series
setAnimated(true); // This is the problem!
}
// ...
// Some general methods that probably aren't important
// ...
public class LineSeries { // This kind of series will be displayed as a connected Line without showing the data points.
int numberOfSeries;
int[] indicesOfSeries;
LineSeries(int numberOfSeries) {
this.numberOfSeries = numberOfSeries;
indicesOfSeries = new int[numberOfSeries];
for (int seriesIndex = 0; seriesIndex < numberOfSeries; seriesIndex++) {
Series<XType, YType> series = new Series<>(); // Generate series
getData().add(series); // Add series to chart
indicesOfSeries[seriesIndex] = getData().indexOf(series); // Store index of series
// Init all Lines
XType[] initialXData = getInitialXDataForLines();
YType[] initialYData = getInitialYDataForLines();
getSeries(seriesIndex).getData().clear();
for (int index = 0; index < accuracyOfPlot; index++) {
getSeries(seriesIndex).getData().add(new Data<>(initialXData[index], initialYData[index]));
}
}
}
Series<XType, YType> getSeries(int index) {
return getData().get(indicesOfSeries[index]);
}
void updateData(int seriesIndex, YType[] yData) {
for (int index = 0; index < accuracyOfPlot; index++) {
// Only update y values
getSeries(seriesIndex).getData().get(index).setYValue(yData[index]);
}
}
// Some methods for styling etc.
}
public class PointSeries { // This kind of series will be displayed as points without the connecting lines
int numberOfSeries;
int[] indicesOfSeries;
PointSeries(int numberOfSeries) {
this.numberOfSeries = numberOfSeries;
indicesOfSeries = new int[numberOfSeries];
for (int index = 0; index < numberOfSeries; index++) {
Series<XType, YType> series = new Series<>(); // Generate series
getData().add(series); // Add series to chart
indicesOfSeries[index] = getData().indexOf(series); // Store index of series
}
}
private Series<XType, YType> getSeries(int index) {
return getData().get(indicesOfSeries[index]);
}
void updateData(int seriesIndex, XType[] xData, YType[] yData) {
getSeries(seriesIndex).getData().clear(); // Clear all existing data
// Now add new given data
for (int pointIndex = 0; pointIndex < xData.length; pointIndex++) {
Data<XType, YType> data = new Data<>(xData[pointIndex], yData[pointIndex]);
getSeries(seriesIndex).getData().add(data);
}
}
// Some methods for styling etc.
}
}
Теперь, если я обновлю серию графика новыми значениями, ряд линий покажет все, как я ожидаю. Но ряд точек не показывает точки в правильных положениях.
Через некоторое время я понял, что это происходит только если я использую setAnimated(true)
. Но это не имеет смысла для меня, у вас есть идеи?
Возможно, это связано с тем, как я обновляю данные:
Для ряда линий я обновляю только значение y для всех данных.
Для серии точек я очищаю все данные и добавляю новые данные после этого.
Если вам нужны какие-то другие части кода, просто скажите мне, но я думаю, этого должно быть достаточно :) Большое спасибо!
Здесь вы можете увидеть, как это происходит с setAnimated(true)
.
Здесь вы можете видеть, как это должно быть (с setAnmiated(false)
).