2015-05-05 3 views
0

ЗадачаRecreate гистограмма без него помнящие данные

У меня есть BarChart, который я должен заполнить с различными данными, снова и снова. Данные должны быть в предопределенном порядке. Конечно, я хочу только изменить данные и не создавать диаграмму каждый раз.

Проблема

После того, как у вас есть категории с заданным именем, которое уже существует в более ранних данных, порядок неправильно.

Я создал пример. Нажав кнопку «Вставить до», добавляется определенное количество баров. После этого добавляется «статический» бар.

Кнопка «Вставить после» добавляет сначала статическую панель, а затем другие бары.

public class BarChartSample extends Application { 

    int count = 1; 

    @Override 
    public void start(Stage stage) { 

     final CategoryAxis xAxis = new CategoryAxis(); 
     final NumberAxis yAxis = new NumberAxis(); 
     final BarChart<String, Number> bc = new BarChart<String, Number>(xAxis, yAxis); 
     bc.setAnimated(false); 

     // create new chart data where the data are inserted before the "static" bar 
     Button insertBeforeButton = new Button("Insert Before"); 
     insertBeforeButton.setOnAction(e -> { 

      XYChart.Series series1 = new XYChart.Series(); 

      for (int i = 0; i < count; i++) { 
       series1.getData().add(new XYChart.Data("New " + i, 50)); 
      } 

      series1.getData().add(new XYChart.Data("Static", 100)); 

      bc.getData().setAll(series1); 

      count++; 

     }); 

     // create new chart data where the data are inserted after the "static" bar 
     Button insertAfterButton = new Button("Insert After"); 
     insertAfterButton.setOnAction(e -> { 

      XYChart.Series series1 = new XYChart.Series(); 

      series1.getData().add(new XYChart.Data("Static", 100)); 

      for (int i = 0; i < count; i++) { 
       series1.getData().add(new XYChart.Data("New " + i, 50)); 
      } 

      bc.getData().setAll(series1); 

      count++; 

     }); 

     // borderpane for chart and toolbar 
     BorderPane bp = new BorderPane(); 
     bp.setCenter(bc); 

     // toolbar 
     HBox hb = new HBox(); 
     hb.getChildren().addAll(insertBeforeButton, insertAfterButton); 
     bp.setTop(hb); 

     Scene scene = new Scene(bp, 400, 200); 

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

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

При запуске программы и нажмите на кнопку «Вставить перед», вы получите это:

enter image description here

При перезапуске программы и нажмите на кнопку «Insert After», вы получите это:

enter image description here

При перезапуске программы и нажмите на кнопку «Вставить перед», а затем на «Insert After», вы получите это:

enter image description here

что неправильно. Оно должно быть таким:

enter image description here

Есть ли способ, чтобы очистить память BarChart в? Очевидно, setData недостаточно.

Я подозреваю, что это имеет какое-то отношение к специальным методам удаления на гистограмме и что данные не были полностью удалены при добавлении новых данных. В исходном коде класса BarChart в JavaFX существуют некоторые сомнительные методы, такие как «seriesBeingRemovedIsAdded».

Большое спасибо за помощь!

+0

Действие «Вставить до» добавит бар перед последним баром, то есть статическим. «Вставить после» добавит строку после последней строки, т. Е. Снова «статический». Логика кажется мне верной. Я не понимаю, как нажать «Вставить до», а затем «Вставить после», должно получиться последнее изображение. Какова его логика? – ItachiUchiha

+0

Кнопки плохо названы («Вставка» для меня подразумевает результат, который вы видите), но логика кода должна привести к последнему изображению; он создает новую (пустую) серию, затем добавляет «Static», затем «New 0», затем «New 1». –

+0

@ItachiUchiha: «Вставить перед» следует добавить ВСЕ столбцы перед «статическим» баром. «Вставить после» следует добавить ВСЕ столбцы после «статической» панели. Всегда, не должно быть микса с некоторыми барами перед статикой, а некоторые после статики. – Roland

ответ

4

Ну .. снова вызвав layout(), кажется, решить проблему

bc.getData().clear(); 
bc.layout(); 
bc.getData().addAll(series1); 

в «Вставить после» второго цикла.

+0

.clearValues ​​(), а не .clear(), если вы, ребята, говорите о MPAndroidChart – Odaym

Смежные вопросы