我正在基于特定系列的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);
}
}