2016-03-24 8 views
0

JavaFx StackedBarChartに問題があります:データをカテゴリ順に並べ替えることができません。問題は、具体的には、私は製品のシリーズを作成しなければならないということです(グループ化されています)が、そうするとチャートは挿入順であり、カテゴリ(この場合は日付)ではありません。JavaFx 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); 

!どうもありがとう!

How it looks now

EDIT:次の操作を実行して、私は正しい順序

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を使用しています(以前のバージョンで問題が発生したので、これを読む)

答えて

0

アップデート:いくつかのアイデアを試した後、私は非常に簡単な解決法を考え出しました。追加を行う前のカテゴリ。

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のデータを処理する前にこれを行うだけです。

関連する問題