LineChart-Series的数据节点被推到一边

时间:2019-03-15 11:34:14

标签: javafx

我有一个针对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值。
对于点系列,我清除所有数据并在此之后添加新数据。

如果您需要代码的其他任何部分,请告诉我,但我想这应该足够了:)非常感谢!

Here,您可以了解setAnimated(true)的情况。
Here(使用setAnmiated(false)),您会看到应该怎样。

0 个答案:

没有答案