Я пишу простое приложение JavaFX7, в котором я отображаю данные, извлеченные из базы данных, используя StackedBarChart.Я также предоставляю пользователю возможность фильтровать отображаемые наборы данных на основе значения определенного свойства.Проблема, с которой я сталкиваюсь, заключается в том, что, похоже, существуют некоторые проблемы с кэшированием.Рассмотрим следующий сценарий
- Первоначальная загрузка, отображение всего для пользователя - без фильтрации.Скажем, наши категории называются 1,2,3,4 и 5 и отображаются в таком порядке (рассмотрим их отсортированными)
- Теперь пользователь выбирает значение фильтра.Это приводит к тому, что на экране отображаются только категории 1, 2, 4 и 5 (опять же, в таком порядке - это ожидаемое поведение)
- Теперь пользователь сбрасывает фильтр на «не фильтровать».
Ожидаемый результат шага 3 будет 1,2,3,4 и 5, в этом порядке.Тем не менее, это 1,2,4,5,3.Обратите внимание, что отфильтрованная категория добавляется обратно в конец массива вместо того, где она должна быть.
То, что я пробовал до сих пор:
- Назначение нового ObservableListчерез Axis.setCategory.это не работает.
- То же, что и выше, но также принудительно обнуляет список категорий перед рукой.
- Сортировка списка категорий.Это также не работает.
Я не могу (пока) обновить Java 8 - я также не могу просто оставить это как неработающую функцию, потому что ожидается, что она будет развернута для пользователей раньшемы обновляем до Java 8. Таким образом, FilteredList в JavaFX 8 не подлежит сомнению (и обратный порт очень раздражает, если посмотреть на изменения в ObservableList).Я также не хочу полностью воссоздавать график, если смогу его избежать.
На данный момент у меня нет идей.Любые предложения приветствуются.Ниже приведена функция, заполняющая график.
private void refreshContents() {
this.vaguesTotal.getData().clear();
this.vaguesDone.getData().clear();
this.vaguesPending.getData().clear();
this.xAxis.setCategories(null);
this.chartCategories = FXCollections.observableArrayList();
// Already sorted here
for (VagueLight vagueInfo : context.getVagues()) {
if (this.categoryFilter != null && this.categoryFilter != vagueInfo.getCategory())
continue;
int dossiersTraites = vagueInfo.getNbDossiersTraites();
int dossiersPending = vagueInfo.getNbDossiersATraiter();
String vagueIdentifier = Integer.toString(vagueInfo.getId());
this.vaguesTotal.getData().add(new Data<String, Number>(vagueIdentifier, 0, vagueInfo));
this.vaguesDone.getData().add(new Data<String, Number>(vagueIdentifier, dossiersTraites, vagueInfo));
this.vaguesPending.getData().add(new Data<String, Number>(vagueIdentifier, dossiersPending, vagueInfo));
this.chartCategories.add(vagueIdentifier);
}
// This just sets up event handlers and styles for the series
for (Series<String, Number> dataSeries : this.barChart.getData()) {
for (Data<String, Number> dataNode : dataSeries.getData()) {
initializeDataNode(dataNode, dataSeries);
}
}
// This is where the "bug" happens
this.xAxis.setCategories(this.chartCategories);
layout(true);
}