JavaFx StackedBarChart在类别后没有排序(JavaFx StackedBarChart not ordered after categories)

编程入门 行业动态 更新时间:2024-10-27 03:36:54
JavaFx StackedBarChart在类别后没有排序(JavaFx StackedBarChart not ordered after categories)

我有一个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.

更多推荐

本文发布于:2023-07-18 10:02:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1158560.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:类别   StackedBarChart   JavaFx   ordered   categories

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!