2015-05-08 2 views
2

Как я могу отсортировать или заказать xAxis BarChart в JavaFX 8, когда xAxis, хотя он определен как строка, представляет числа. Например:Заказ категории xAxis в JavaFX 8 BarChart

@Override public void start(Stage stage) { 
    stage.setTitle("Bar Chart Sample"); 
    final CategoryAxis xAxis = new CategoryAxis(); 
    final NumberAxis yAxis = new NumberAxis(); 
    final BarChart<String,Number> bc = 
     new BarChart<>(xAxis,yAxis); 
    bc.setTitle("Country Summary"); 
    xAxis.setLabel("Number");  
    yAxis.setLabel("Value"); 

    XYChart.Series series1 = new XYChart.Series(); 
    series1.setName("Series-1"); 
    series1.getData().add(new XYChart.Data("2",200)); 
    series1.getData().add(new XYChart.Data("3",500)); 
    series1.getData().add(new XYChart.Data("4",100)); 

    XYChart.Series series2 = new XYChart.Series(); 
    series2.setName("Series-2"); 
    series2.getData().add(new XYChart.Data("1",900)); 
    series2.getData().add(new XYChart.Data("2",150)); 
    series2.getData().add(new XYChart.Data("3",50)); 
    series2.getData().add(new XYChart.Data("4",700)); 

    Scene scene = new Scene(bc,800,600); 
    bc.getData().addAll(series1, series2); 

    stage.setScene(scene); 
    stage.show(); 
} 

Хотя это упрощенный способ показать проблему, в моем коде я генерации BarChart из огромного файла Excel. Ниже приведен фрагмент кода am:

final ObservableList<XYChart.Series<String,Number>> barChartData =  FXCollections.observableArrayList(); 

      Iterator<Map.Entry<String, ArrayList<XYBean>>> it = xyBean.entrySet().iterator(); 
      while (it.hasNext()) { 
       Map.Entry<String, ArrayList<XYBean>> entry = it.next(); 
       XYChart.Series series = new XYChart.Series<>(); 
       series.setName(entry.getKey()); 
       for (XYBean xybean : entry.getValue()) { 
        series.getData().add(new XYChart.Data(xybean.getxValue(), xybean.getyValue())); 

       } 

       barChartData.add(series); 

      } 
barChart.setData(barChartData); 

Пожалуйста, помогите, и спасибо заранее!

ответ

0

Один из способов - получить категории из xAxis и отсортировать их с помощью компаратора. Хотя у меня создалось впечатление, что категория Axis делает это сама по себе.

ObservableList<String>list = xAxis.getCategories(); 
Comparator<String> byValue = (e1, e2) -> Integer.compare(Integer.parseInt(e1), Integer.parseInt(e2)); 
xAxis.setCategories(list.sort(byValue)); 
+0

Спасибо за ответ, но я попытался использовать компаратор, но, вероятно, я делал все это неправильно, пожалуйста, поделитесь кодом, как вы достичь этого, учитывая фрагмент кода? Спасибо. – user3456266

+0

ObservableList list = xAxis.getCategories(); Кажется, эта строка ничего не получает, когда я проверяю размер списка, нуль, я что-то упускаю? Благодарю. – user3456266

+0

Убедитесь, что вы вызываете его после того, как данные загружены в диаграмму. – JeramyRR

0

Вам необходимо отсортировать категории.

Collections.sort(xAxis.getCategories()); 

делает не работает, тем не менее.

Один из способов , который работает выглядит следующим образом:

// fill this whenever you add new data to the chart 
private final Set<String> categories = new LinkedHashSet<>(); 

// after all data is added to the chart, sort the categories, set them manually and enable auto-ranging again (if needed) 
final ObservableList<String> c = FXCollections.observableArrayList(categories); 
Collections.sort(c); 
xAxis.setCategories(c); 
xAxis.setAutoRanging(true); 
Смежные вопросы