日安,
我的问题
我正在编写一个使用JavaFX的LineCharts应用程序。我想添加在LineChart上创建不连续的功能。我希望这样做,以便当我的程序从数据库中读取数据时,它将打破丢失部分数据的行。在我的程序当前表单中,图形看起来像这。我从下面的这帖子中获得了下面的代码,我一直试图对它进行修改,以适应我的程序的需要。
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));我做了什么,
我已经尝试删除不连续发生的元素,但是这会导致图的某些部分没有通过点的直线。这个结果可以看到这里。
我还将上面的代码(对数据类型做了一些修改)添加到我的应用程序中,并得到了这结果。
发布于 2018-08-28 11:52:46
也许你可以把一条不连续的线建模成两个或更多的线段?图形化例程不知道不连续性,并且假设当一组数据连接时所提供的所有数据点。
我会考虑创建一个更高级别的对象,该对象包含零个或多个数据序列,每个数据序列表示为图形上的一个单独的“行”。较高级别的对象将负责设置其包含的线条的外观,以使所有段看起来都一样(颜色、线条样式、数据点符号)。用户将将其解释为具有不连续性的一行。
https://stackoverflow.com/questions/52056633
复制相似问题