如何对 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) {
      //Defining the x axis
      NumberAxis xAxis = new NumberAxis(1960, 2020, 10);
      xAxis.setLabel("Years");
      //Defining the y axis
      NumberAxis yAxis = new NumberAxis (0, 350, 50);
      yAxis.setLabel("No.of schools");
      //Preparing the data for the X-Y chart
      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));
      //Creating data
      ObservableList<Series<Number, Number>> data =
      FXCollections.observableArrayList(series);
      //Creating the Line chart
      LineChart<Number,Number> lineChart = new LineChart<Number,Number>(xAxis, yAxis, data ) {
         //Overriding the layoutPlotChildren method
         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);
            }
         }
      };
      //Adding the line chart to stack pane
      StackPane pane = new StackPane(lineChart);
      //Setting the scene
      Scene scene = new Scene(pane, 595, 300);
      stage.setTitle("Line Chart");
      stage.setScene(scene);
      stage.show();
   }
   public static void main(String args[]){
      launch(args);
   }
}

输出

更新日期:2020-5-19

396 次浏览

开启你的职业

完成课程获取认证

开始
广告
© . All rights reserved.