【问题标题】:How to use descending sorting first when clicking TableView column header?单击TableView列标题时如何先使用降序排序?
【发布时间】:2020-12-03 11:36:16
【问题描述】:

Javafx TableView 排序在单击列标题时首先使用升序,然后在第二次单击时使用降序。我有一个包含运动队数据的表格,其中包含胜利、失败等列。默认情况下,胜利应该按降序排序,而失败则按升序排序,因此当单击标题一次时,每个类别中最好的球队总是排在最前面。

我在 fxml 文件中尝试了sortType="DESCENDING",在代码中尝试了setSortType(TableColumn.SortType.DESCENDING),但没有任何效果。

【问题讨论】:

  • 令人惊讶的是,sortOrders 中的循环被硬编码(在 TableColumnHeader,私有方法 sortColumn 中)为未排序 -> 升序 -> 降序 -> 未排序 - 所以我们无能为力。至少不会变脏:a)通过设置倒置比较器(缺点:错误图标)或 b)实现自定义 TableColumnHeader 并替换 onMouseReleasedHandler 调用自定义方法来循环排序顺序(缺点: 需要在内部进行反射摆弄 - 或自定义 jfx 图像)
  • 谢谢你,所有有价值的信息。我找到了一个非常适合我的用例的解决方案,将其作为答案发布。

标签: java sorting javafx fxml javafx-tableview


【解决方案1】:

在我的用例中,二级排序选项更多的是障碍。我想出的解决方案只允许以一种方式对列进行排序,单击标题在排序和不用于排序之间切换。

只允许降序排序更简单,只需要一个表 sortOrder 的监听器。但是,只允许升序排序需要向列 sortTypeProperty 添加一个侦听器,并且要使用 shift 键进行多重排序才能正常工作,还必须在表 sortOrder 侦听器中强制执行正确的排序。

columnLosses.sortTypeProperty().addListener(o -> {
    if (columnLosses.getSortType().equals(TableColumn.SortType.DESCENDING)) {
        table.getSortOrder().remove(columnLosses);
    }
});
table.getSortOrder().addListener((Observable o) -> {
    if (table.getSortOrder().contains(columnWins)) {
        columnWins.setSortType(TableColumn.SortType.DESCENDING);
    }
    if (columnLosses.getSortType().equals(TableColumn.SortType.DESCENDING)) {
        columnLosses.setSortType(TableColumn.SortType.ASCENDING); // needed for correct multicolumn sorting
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-29
    • 2014-12-08
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    相关资源
    最近更新 更多