首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将不连续性添加到JavaFX LineChart中

将不连续性添加到JavaFX LineChart中
EN

Stack Overflow用户
提问于 2018-08-28 11:21:04
回答 1查看 334关注 0票数 2

日安,

我的问题

我正在编写一个使用JavaFX的LineCharts应用程序。我想添加在LineChart上创建不连续的功能。我希望这样做,以便当我的程序从数据库中读取数据时,它将打破丢失部分数据的行。在我的程序当前表单中,图形看起来像。我从下面的帖子中获得了下面的代码,我一直试图对它进行修改,以适应我的程序的需要。

代码语言:javascript
复制
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));


        }

    }
}

此代码在上面的形式中工作得很好,但是它没有正确地显示多个不连续点。当我向上面的程序添加以下代码时,我获得了输出的屏幕截图

代码语言:javascript
复制
MyLineChart chart = new MyLineChart(xAxis, yAxis, Arrays.asList(5, 7)); //added 7 to the array
.....
serie.getData().add(new Data<Number, Number>(8, 7));

我做了什么,

我已经尝试删除不连续发生的元素,但是这会导致图的某些部分没有通过点的直线。这个结果可以看到这里

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-28 11:52:46

也许你可以把一条不连续的线建模成两个或更多的线段?图形化例程不知道不连续性,并且假设当一组数据连接时所提供的所有数据点。

我会考虑创建一个更高级别的对象,该对象包含零个或多个数据序列,每个数据序列表示为图形上的一个单独的“行”。较高级别的对象将负责设置其包含的线条的外观,以使所有段看起来都一样(颜色、线条样式、数据点符号)。用户将将其解释为具有不连续性的一行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52056633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档