Добавление разрывов в линейную диаграмму JavaFX - PullRequest
0 голосов
/ 28 августа 2018

Добрый день,

Мой выпуск

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

package application;

import java.util.Arrays;
import java.util.List;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.Axis;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.chart.XYChart.Series;
import javafx.scene.shape.Circle;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.stage.Stage;


public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {

            NumberAxis xAxis = new NumberAxis();
            NumberAxis yAxis = new NumberAxis();
            MyLineChart chart = new MyLineChart(xAxis, yAxis, Arrays.asList(5));


            XYChart.Series<Number, Number> serie = new Series<>();

            serie.getData().add(new Data<Number, Number>(0, 5));
            serie.getData().add(new Data<Number, Number>(1, 5));
            serie.getData().add(new Data<Number, Number>(2, 5));
            serie.getData().add(new Data<Number, Number>(3, 5));
            serie.getData().add(new Data<Number, Number>(4, 5));
            serie.getData().add(new Data<Number, Number>(5, -5));
            serie.getData().add(new Data<Number, Number>(6, -5));
            serie.getData().add(new Data<Number, Number>(7, -5));

            chart.getData().add(serie);

            Path p = (Path) serie.getNode();        

            Scene scene = new Scene(chart,400,400);
            primaryStage.setScene(scene);
            primaryStage.show();



    }

    public static void main(String[] args) {
        launch(args);
    }

    private static class MyLineChart extends LineChart<Number,Number>{


        private List<Integer> breakpointIndex;

        public MyLineChart(Axis<Number> xAxis, Axis<Number> yAxis, List<Integer> breakpointIndex) {
            super(xAxis, yAxis);
            this.breakpointIndex = breakpointIndex;
        }

        @Override
        protected void layoutPlotChildren() {
            super.layoutPlotChildren();

            Path p = (Path) getData().get(0).getNode();

            breakpointIndex.forEach(i ->{

                Data<Number, Number> discontinuousPoint = getData().get(0).getData().get(i+1);
                p.getElements().add(i+1, new MoveTo(getXAxis().getDisplayPosition( discontinuousPoint.getXValue()), getYAxis().getDisplayPosition(discontinuousPoint.getYValue())));

            });

            System.out.println("\nnew Path :");
            p.getElements().forEach(e -> System.out.println("p : " + e));


        }

    }
}

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

MyLineChart chart = new MyLineChart(xAxis, yAxis, Arrays.asList(5, 7)); //added 7 to the array
.....
serie.getData().add(new Data<Number, Number>(8, 7));

Что я сделал

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

Я также добавил приведенный выше код (с некоторыми изменениями типов данных) в свое приложение, и я получаю этот результат.

1 Ответ

0 голосов
/ 28 августа 2018

Возможно, вы могли бы смоделировать прерывную линию в виде двух или более отрезков? Процедуры построения графиков не знают о разрыве и предполагают, что все точки данных, которые вы предоставляете как один набор, подключены.

Я бы подумал о создании объекта более высокого уровня, который содержит ноль или более рядов данных, каждый из которых представлен в виде отдельной «линии» на графике. Объект более высокого уровня будет отвечать за настройку внешнего вида содержащейся в нем линии, поэтому все сегменты будут выглядеть одинаково (цвет, стиль линии, символ точки данных). Пользователь интерпретирует это как одну строку с разрывами.

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