2016-03-24 8 views
0

Ich habe ein Problem mit JavaFxs StackedBarChart: Ich kann nicht die Daten in der Reihenfolge der Kategorie sortiert bekommen. Das Problem ist speziell, dass ich Serien für die Produkte erstellen muss (so dass sie gruppiert sind), aber wenn ich das tue, ist das Diagramm Reihenfolge in der Reihenfolge und nicht in der Reihenfolge der Kategorien (in diesem Fall Daten).JavaFx StackedBarChart nicht nach Kategorien sortiert

Das ist der Code, den ich die StackedBarChart erstellen können:

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); 

Ich hoffe, dass jemand eine Lösung für dieses Problem kennt und mich mit einer Lösung bieten könnte! Danke vielmals!

How it looks now

EDIT: durch die folgende 'Hack' zu tun, bevor Sie das Einfügen von Daten erhalte ich die richtige Reihenfolge

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. Ich benutze die neueste Version: 1.8.0_77-b03 (da ich über ein Bestellproblem in früheren Versionen gelesen habe)

Antwort

0

Update: Nachdem ich einige verschiedene Ideen ausprobiert habe, kam ich auf eine ziemlich einfache Lösung, ich initiiere das Balkendiagramm mit die Kategorien vor dem Hinzufügen.

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); 

Tun Sie dies, bevor Sie die Daten für den BarChart verarbeiten.