有没有办法在JavaFX LineChart中断开2个串联串?

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

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

在此处输入图像描述

是的你可以

如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 serie = new Series<>(); serie.getData().add(new Data(0, 5)); serie.getData().add(new Data(1, 5)); serie.getData().add(new Data(2, 5)); serie.getData().add(new Data(3, 5)); serie.getData().add(new Data(4, 5)); serie.getData().add(new Data(5, -5)); serie.getData().add(new Data(6, -5)); serie.getData().add(new Data(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{ private List breakpointIndex; public MyLineChart(Axis xAxis, Axis yAxis, List breakpointIndex) { super(xAxis, yAxis); this.breakpointIndex = breakpointIndex; } @Override protected void layoutPlotChildren() { super.layoutPlotChildren(); Path p = (Path) getData().get(0).getNode(); breakpointIndex.forEach(i ->{ Data 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(如果可以的话,看看原始方法的代码很有意思)。

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

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

查看doc有访问chartelement的方法,比如getPlotChildren(),getchartchildren()。

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