LineChart - узлы данных Series сдвигаются в сторону - PullRequest
0 голосов
/ 15 марта 2019

У меня есть этот абстрактный класс для 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)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...