如何为JavaFX xy图表的绘制区域着色?
所有XY图表都有一个名为layoutPlotChildren()的抽象方法。为XY图表的绘制区域(区域)着色的一种方法是覆盖此方法。通常,它被称为更新和布局子图。
在此方法的主体中-
获取系列数据。
提取绘制的点。
使用提取的点在绘图区域中绘制多边形。
将所需的颜色设置为多边形。
示例
import javafx.application.Application; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Scene; import javafx.stage.Stage; import javafx.scene.chart.LineChart; import javafx.scene.chart.NumberAxis; import javafx.scene.chart.XYChart; import javafx.scene.chart.XYChart.Series; import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import javafx.scene.shape.Polygon; public class EnhancingGraphPlot extends Application { public void start(Stage stage) { //定义x轴 NumberAxis xAxis = new NumberAxis(1960, 2020, 10); xAxis.setLabel("Years"); //定义y轴 NumberAxis yAxis = new NumberAxis (0, 350, 50); yAxis.setLabel("No.of schools"); //准备XY图表的数据 XYChart.Series<Number,Number> series = new XYChart.Series<Number,Number>(); series.setName("No of schools in an year"); series.getData().add(new XYChart.Data<Number,Number>(1970, 15)); series.getData().add(new XYChart.Data<Number,Number>(1980, 30)); series.getData().add(new XYChart.Data<Number,Number>(1990, 60)); series.getData().add(new XYChart.Data<Number,Number>(2000, 120)); series.getData().add(new XYChart.Data<Number,Number>(2013, 240)); series.getData().add(new XYChart.Data<Number,Number>(2014, 300)); //创建数据 ObservableList<Series<Number, Number>> data = FXCollections.observableArrayList(series); //创建折线图 LineChart<Number,Number> lineChart = new LineChart<Number,Number>(xAxis, yAxis, data ) { //覆盖layoutPlotChildren方法 protected void layoutPlotChildren() { super.layoutPlotChildren(); Series<Number,Number> series = (Series<Number,Number>) getData().get(0); ObservableList<Data<Number,Number>> listOfData = series.getData(); for(int i = 0; i < listOfData.size()-1; i++) { double x1 = getXAxis().getDisplayPosition(listOfData.get(i).getXValue()); double y1 = getYAxis().getDisplayPosition(0); double x2 = getXAxis().getDisplayPosition(listOfData.get((i + 1)).getXValue()); double y2 = getYAxis().getDisplayPosition(0); Polygon polygon = new Polygon(); polygon.getPoints().addAll(new Double[]{ x1,y1, x1, getYAxis().getDisplayPosition(listOfData.get(i).getYValue()), x2,getYAxis().getDisplayPosition(listOfData.get((i+1)).getYValue()), x2,y2 }); getPlotChildren().add(polygon); polygon.toFront(); polygon.setFill(Color.DIMGRAY); } } }; //将折线图添加到堆栈窗格 StackPane pane = new StackPane(lineChart); //设置场景 Scene scene = new Scene(pane, 595, 300); stage.setTitle("Line Chart"); stage.setScene(scene); stage.show(); } public static void main(String args[]){ launch(args); } }
输出结果