【问题标题】:JavaFx StackedBarChart not ordered after categoriesJavaFx StackedBarChart 未按类别排序
【发布时间】:2016-03-26 19:18:36
【问题描述】:

我在使用 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);

附言。我使用最新版本:1.8.0_77-b03(因为我在以前的版本中读到过一个排序问题)

【问题讨论】:

    标签: javafx bar-chart stacked-chart


    【解决方案1】:

    更新:在尝试了一些不同的想法后,我想出了一个非常简单的解决方案,我只是在添加之前使用类别初始化条形图。

    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 的数据之前执行此操作即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      • 2021-09-02
      • 2015-07-05
      • 2018-05-18
      相关资源
      最近更新 更多