JavaFX过滤类别

时间:2018-10-04 08:42:54

标签: java sorting javafx charts filtering

我正在编写一个简单的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。请注意,过滤掉的类别会添加回数组的末尾,而不是应添加的位置。

到目前为止我已经尝试过的事情:

  • 通过Axis.setCategory分配新的ObservableList。这不起作用。
  • 与上述相同,但也强制类别列表先为空。
  • 排序类别列表。这也不起作用。

我还无法更新到Java 8-我也不能仅仅将其保留为已损坏的功能,因为在我们升级到Java 8之前,该功能预计会向用户推出。因此JavaFX 8的FilteredList已淘汰问题(仅查看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);
}

0 个答案:

没有答案