java - 有没有办法在 JavaFX LineChart 中断开串联的 2 个点?

标签 java javafx linechart

我在 LineChart 上有四个系列。每个系列都包含一定数量的按时间划分的图表。默认情况下,LineChart 连接这些图表。它看起来很难看并且在上下文中没有任何意义,所以我想将它们分开,但保留颜色和图例。换句话说,我想要的是删除两个特定点之间的连接。有没有办法做到这一点,而不需要向图表添加新系列(图表在逻辑上是连接的,添加新系列会让用户感到困惑并使图表困惑)?

for(int j = 0; j < 4; j++) {
    XYChart.Series<Float, Float> series = new XYChart.Series<>();
    series.setName("Канал " + (j + 1));
    fillWithData(series);
    chart.getData().add(series);
}

enter image description here

最佳答案

是的,你可以

https://docs.oracle.com/javase/8/javafx/api/javafx/scene/chart/XYChart.Series.html#nodeProperty 中所述serie节点用于存储线。该节点是一个可以修改的路径。

看看这个小应用程序:

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


            //getPlotChildren().add(new Circle(50));


        }

    }
}

您必须重写负责绘制图表的layoutplotchildren方法(如果可以的话,看看原始方法的代码很有趣)。

然后你就可以在这里画你想要的东西了。

在我的小应用程序中,我只是修改已经创建的节点,但您可以省略 super 调用并绘制您想要的内容。

查看文档,您有访问图表元素的方法,例如 getPlotChildren()、getchartchildren()。

您可以使用 getdata() 访问添加到图表中的系列

关于java - 有没有办法在 JavaFX LineChart 中断开串联的 2 个点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38591452/

相关文章:

java - 在 Web 应用程序中加载属性文件

java - System.out.println 和 System.err.println 乱序

java - 在 HTML 网页中嵌入 JavaFX 应用程序

Javafx:从 TableCell 获取属性

javascript - 在图例悬停时突出显示线系列

javascript - Angular-nvD3(krispo) 带 ng-repeat 的单线图

php - 如何使用 PhpSpreadSheet 折线图在每个标记中设置可见数据标签?

java - try-catch 中无限递归的混淆输出

java - 在开发环境中的 tomcat 中重新加载 Web 应用程序的简单快捷方法是什么?

javafx - JavaFX窗口setTitle