Категории фильтрации JavaFX - PullRequest
       16

Категории фильтрации JavaFX

0 голосов
/ 04 октября 2018

Я пишу простое приложение JavaFX7, в котором я отображаю данные, извлеченные из базы данных, используя StackedBarChart.Я также предоставляю пользователю возможность фильтровать отображаемые наборы данных на основе значения определенного свойства.Проблема, с которой я сталкиваюсь, заключается в том, что, похоже, существуют некоторые проблемы с кэшированием.Рассмотрим следующий сценарий

  1. Первоначальная загрузка, отображение всего для пользователя - без фильтрации.Скажем, наши категории называются 1,2,3,4 и 5 и отображаются в таком порядке (рассмотрим их отсортированными)
  2. Теперь пользователь выбирает значение фильтра.Это приводит к тому, что на экране отображаются только категории 1, 2, 4 и 5 (опять же, в таком порядке - это ожидаемое поведение)
  3. Теперь пользователь сбрасывает фильтр на «не фильтровать».

Ожидаемый результат шага 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);
}
...