Воссоздать гистограмму без запоминания данных
задача
У меня есть 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);
}
}
Когда вы запускаете программу и нажимаете "Вставить перед", вы получаете это:
Когда вы перезапустите программу и нажмете "Вставить после", вы получите следующее:
Когда вы перезапустите программу и нажмете "Вставить до", а затем "Вставить после", вы получите следующее:
что неправильно. Должно быть так:
Есть ли способ очистить память Barchart? Очевидно, setData недостаточно.
Я подозреваю, что это связано со специальными методами удаления в гистограмме и что данные не были полностью удалены при добавлении новых данных. В исходном коде класса BarChart в JavaFX есть несколько сомнительных методов, таких как "seriesBeingRemovedIsAdded".
Огромное спасибо за помощь!
1 ответ
Ну.. опять звоню layout()
кажется, чтобы решить проблему
bc.getData().clear();
bc.layout();
bc.getData().addAll( series1 );
во втором цикле "Вставить после".