JavaFX:如何根据特定XYChart.Serie的y值对堆积条形图中的条形进行排序?

时间:2020-04-24 17:27:51

标签: java javafx stackedbarseries

我正在基于特定系列的Y值在StackedBar图表中对条形进行排序,但是我未能使条形改变其顺序。目的是按照The first chart is not sorted by the red colour (serie). I want to achieve the second chart所选系列的颜色的升序对条进行排序-每当用户单击特定系列的按钮时,就会激活该条。如何在JavaFX中实现这一目标?您的帮助将不胜感激。谢谢!

请参见下面的代码

package sample;

import java.math.BigDecimal;
import java.util.*;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.StackedBarChart;
import javafx.scene.chart.XYChart;

public class Main extends Application {
    @Override
    public void start(Stage stage) {
        //Defining the axes
        CategoryAxis xAxis = new CategoryAxis();
        xAxis.setCategories(FXCollections.<String>observableArrayList(Arrays.asList
                ("Africa", "America", "Asia", "Europe", "Oceania")));

        xAxis.setLabel("category");
        xAxis.setAutoRanging(false);
        NumberAxis yAxis = new NumberAxis();
        yAxis.setLabel("Population (In millions)");

        //Creating the Bar chart
        StackedBarChart<String, Number> stackedBarChart =
                new StackedBarChart<>(xAxis, yAxis);
        stackedBarChart.setTitle("Historic World Population by Region");

        //Prepare XYChart.Series objects by setting data
        XYChart.Series<String, Number> series1 = new XYChart.Series<>();
        series1.setName("1800");
        series1.getData().add(new XYChart.Data<>("Africa", 450));
        series1.getData().add(new XYChart.Data<>("America", 431));
        series1.getData().add(new XYChart.Data<>("Asia", 635));
        series1.getData().add(new XYChart.Data<>("Europe", 503));
        series1.getData().add(new XYChart.Data<>("Oceania", 982));

        XYChart.Series<String, Number> series2 = new XYChart.Series<>();
        series2.setName("1900");
        series2.getData().add(new XYChart.Data<>("Africa", 633));
        series2.getData().add(new XYChart.Data<>("America", 156));
        series2.getData().add(new XYChart.Data<>("Asia", 1047));
        series2.getData().add(new XYChart.Data<>("Europe", 1008));
        series2.getData().add(new XYChart.Data<>("Oceania", 560));

        XYChart.Series<String, Number> series3 = new XYChart.Series<>();
        series3.setName("2008");
        series3.getData().add(new XYChart.Data<>("Africa", 973));
        series3.getData().add(new XYChart.Data<>("America", 914));
        series3.getData().add(new XYChart.Data<>("Asia", 4054));
        series3.getData().add(new XYChart.Data<>("Europe", 932));
        series3.getData().add(new XYChart.Data<>("Oceania", 1054));

        //Setting the data to bar chart
        stackedBarChart.getData().addAll(series1, series2, series3);

        // adding a mouse event on every bar to change order of the bars when clicked.
            stackedBarChart.getData().forEach((series) -> {
                series.getData().forEach((item) -> {
                    item.getNode().setOnMousePressed((MouseEvent event) -> {
                        MouseButton button = event.getButton();
                        if (button == MouseButton.PRIMARY) {

                            // sort based on the first serie -> "1800"
                            stackedBarChart.getData().get(0).getData().sort((XYChart.Data<String, Number> o1, XYChart.Data<String, Number> o2)
                                    ->{
                                Number xValue1 = (Number) o1.getYValue();
                                Number xValue2 = (Number) o2.getYValue();
                                return new BigDecimal(xValue1.toString()).compareTo(new BigDecimal(xValue2.toString()));
                            });

                            // check if the values have been sorted.
                            // Result: [Data[America,431,null], Data[Africa,450,null], Data[Europe,503,null], Data[Asia,635,null], Data[Oceania,982,null]]
                            // means they have been sorted but the bars are not sorted in the ascending order!
                            System.out.println(stackedBarChart.getData().get(0).getData().toString());
                        }
                    });
                });
            });

        //Creating a Group object
        Group root = new Group(stackedBarChart);

        //Creating a scene object
        Scene scene = new Scene(root, 600, 400);

        //Setting title to the Stage
        stage.setTitle("stackedBarChart");

        //Adding scene to the stage
        stage.setScene(scene);

        //Displaying the contents of the stage
        stage.show();
    }
    public static void main(String args[]){
        launch(args);
    }
}

0 个答案:

没有答案
相关问题