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(因为我在以前的版本中了解到一个排序问题)
更新:在尝试了一些不同的想法后,我想出了一个非常简单的解决方案,我只是在添加之前用类别初始化条形图。
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);
只需在处理条形图的数据之前执行此操作即可。
我在使用 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(因为我在以前的版本中了解到一个排序问题)
更新:在尝试了一些不同的想法后,我想出了一个非常简单的解决方案,我只是在添加之前用类别初始化条形图。
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);
只需在处理条形图的数据之前执行此操作即可。