JavaFX: Как сортировать столбцы в гистограмме с накоплением на основе значений y определенного XYChart.Ser ie? - PullRequest
0 голосов
/ 24 апреля 2020

Я сортирую бары на диаграмме StackedBar на основе значений Y определенного ser ie, но мне не удалось заставить бары изменить свой порядок. Целью является сортировка баров в порядке возрастания . Первый график не отсортирован по красному цвету (ser ie). Я хочу получить на втором графике цвет выбранного ser ie - он будет активирован всякий раз, когда пользователь нажимает кнопку указанного c ser ie. Как я могу добиться этого в 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);
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...