我有一个JavaFxs StackedBarChart的问题:我无法设法按类别顺序对数据进行排序。 具体问题是我必须为产品创建系列(以便将它们组合在一起),但是当我这样做时,图表是按顺序排序而不是按类别(在本例中为日期)顺序排序。
这是我用来创建StackedBarChart的代码:
ObservableList<XYChart.Series<String, Number>> data = FXCollections.observableArrayList(); final ArrayList<String> dates = new ArrayList<>(); HashMap<Integer, List<XYChart.Data<String, Number>>> map = new HashMap<>(); HashMap<Integer, String> productNames = new HashMap<>(); for(SoldProduct sp : products) { if (!map.containsKey(sp.getId())) { map.put(sp.getId(), new ArrayList<>()); productNames.put(sp.getId(), sp.getName()); } if(!dates.contains(sp.getDate().toString())){ dates.add(sp.getDate().toString()); } List<XYChart.Data<String, Number>> list = map.get(sp.getId()); list.add(new XYChart.Data<String, Number>(sp.getDate().toString(), sp.getAmount())); map.put(sp.getId(), list); } ((CategoryAxis)barChart.getXAxis()).getCategories().setAll(dates); barChart.setCategoryGap((500.0/dates.size())/2); for(Map.Entry<Integer, List<XYChart.Data<String, Number>>> entry : map.entrySet()){ final StackedBarChart.Series<String, Number> series = new StackedBarChart.Series<String, Number>(); series.setName(productNames.get(entry.getKey())); series.getData().addAll(entry.getValue()); data.add(series); } barChart.setData(data);我希望有人知道这个问题的解决方案,并可以为我提供解决方案! 非常感谢!
编辑:通过在插入数据之前执行以下“hack”我得到正确的顺序
final StackedBarChart.Series<String, Number> notUsed = new StackedBarChart.Series<String, Number>(); notUsed.setName("Workaround JAVAFX BarChart Ordering Problem"); for(String d : dates){ notUsed.getData().add(new XYChart.Data<String, Number>(d, 0)); } data.add(notUsed);PS。 我使用的是最新版本:1.8.0_77-b03(因为我读过以前版本中的订购问题)
I have a problem with JavaFxs StackedBarChart: I can't manage to get the Data to be sorted in categorie order. The problem specifically is that i have to create Series for the Products (so that they are grouped together) but when i do that the chart is order in insertion order and not in the categories (in this case dates) order.
Thats the code i use to create the StackedBarChart:
ObservableList<XYChart.Series<String, Number>> data = FXCollections.observableArrayList(); final ArrayList<String> dates = new ArrayList<>(); HashMap<Integer, List<XYChart.Data<String, Number>>> map = new HashMap<>(); HashMap<Integer, String> productNames = new HashMap<>(); for(SoldProduct sp : products) { if (!map.containsKey(sp.getId())) { map.put(sp.getId(), new ArrayList<>()); productNames.put(sp.getId(), sp.getName()); } if(!dates.contains(sp.getDate().toString())){ dates.add(sp.getDate().toString()); } List<XYChart.Data<String, Number>> list = map.get(sp.getId()); list.add(new XYChart.Data<String, Number>(sp.getDate().toString(), sp.getAmount())); map.put(sp.getId(), list); } ((CategoryAxis)barChart.getXAxis()).getCategories().setAll(dates); barChart.setCategoryGap((500.0/dates.size())/2); for(Map.Entry<Integer, List<XYChart.Data<String, Number>>> entry : map.entrySet()){ final StackedBarChart.Series<String, Number> series = new StackedBarChart.Series<String, Number>(); series.setName(productNames.get(entry.getKey())); series.getData().addAll(entry.getValue()); data.add(series); } barChart.setData(data);I hope someone knows a solution for this problem and could provide me with a solution! Thanks a lot!
EDIT: by doing the following 'hack' before inserting the data i get the correct order
final StackedBarChart.Series<String, Number> notUsed = new StackedBarChart.Series<String, Number>(); notUsed.setName("Workaround JAVAFX BarChart Ordering Problem"); for(String d : dates){ notUsed.getData().add(new XYChart.Data<String, Number>(d, 0)); } data.add(notUsed);PS. i use the latest version: 1.8.0_77-b03 (since i read about an ordering problem in previous versions)
最满意答案
更新:在尝试了一些不同的想法后,我提出了一个非常简单的解决方案,我只是在进行任何添加之前使用类别初始化条形图。
ObservableList<String> dates = FXCollections.observableArrayList(); for(SoldProduct sp : products) { //Your data if(!dates.contains(sp.getDate().toString())){ dates.add(sp.getDate().toString()); } } ((CategoryAxis)barChart.getXAxis()).setCategories(dates);只需在处理barChart的数据之前执行此操作。
Update: After trying out some different ideas i came up with a pretty simple solution, i just init the Barchart with the categories before doing any adding.
ObservableList<String> dates = FXCollections.observableArrayList(); for(SoldProduct sp : products) { //Your data if(!dates.contains(sp.getDate().toString())){ dates.add(sp.getDate().toString()); } } ((CategoryAxis)barChart.getXAxis()).setCategories(dates);Just do this before processing the data for the barChart.
更多推荐
发布评论