美好的一天,

我的问题

我正在编写一个使用LineCharts的JavaFX应用程序。我想添加在LineChart上创建不连续点的功能。我想这样做,以便当我的程序从数据库读取数据时,它将中断缺少部分数据的行。在我的程序当前形式中,图形看起来像this。我从SO的this帖子中获取了以下代码,并且一直在尝试对其进行调整以适合我的程序的需求。

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));


        }

    }
}


该代码在上述形式中可以完美地工作,但是不能正确显示多个间断。当我将以下代码添加到上述程序中时,我已经采用了输出的screenshot

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


我做了什么

我尝试删除发生不连续性的元素,但这会导致图形的某些部分没有穿过点的线。可以在here中看到此结果。

我还将上面的代码(对数据类型进行了一些修改)添加到了我的应用程序中,并得到了this结果。

最佳答案

也许您可以将不连续的线建模为两个或多个线段?制图例程不知道间断,并且将假设您将一组提供的所有数据点连接在一起。

我会考虑创建一个更高级别的对象,其中包含零个或多个数据系列,每个数据系列在图中表示为单独的“线”。较高级别的对象将负责设置其包含的线的外观,因此所有线段都将显示相同(颜色,线型,数据点符号)。用户会将其解释为不连续的单行。

关于java - 将不连续性添加到JavaFX LineChart,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52056633/

10-10 16:43