java - 替换 JavaFX 中的列排序

标签 java sorting javafx javafx-8

我有一个 TableView 和表列,我用它们替换了排序。

排序事件:

nameColumn.sortTypeProperty().addListener(
new ChangeListener<SortType>() {
    @Override
    public void changed(
        ObservableValue<? extends SortType> observable,
        SortType oldValue, SortType newValue) {
            FXListSorter.sortPersonByName(fetchResults, newValue);
            showFetchResultsByPage();
        }
    });

列表排序器:

public static void sortPersonByName(ObservableList<PersonBean> list,
        SortType sortType) {
    FXCollections.sort(list, new Comparator<PersonBean>() {
        @Override
        public int compare(PersonBean p1, PersonBean p2) {
            if (sortType.equals(SortType.ASCENDING)) {
                return p1.toString().compareToIgnoreCase(p2.toString());
            } else {
                return p2.toString().compareToIgnoreCase(p1.toString());
            }
        }
    });
}

显示获取的结果:

private void showFetchResultsByPage() {
    int start = currentPageIndex * pageSize;
    if (start > fetchResults.size()) {
        return;
    }
    int maxValForPage = currentPageIndex * pageSize + pageSize;
    int end = (maxValForPage <= fetchResults.size()) ? maxValForPage
            : fetchResults.size();
    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            personsTableView.getItems().setAll(
                    fetchResults.subList(start, end));
        }
    });

}

仍然,当我对表列进行排序时,首先执行 TableView 的默认排序,然后是我创建的排序。

有没有办法禁用 TableView 的默认排序?谢谢

最佳答案

在 Java 8 中,要更改列的比较器(例如以不区分大小写的方式对字符串进行排序),您可以这样做

nameColumn.setComparator((name1, name2) -> name1.compareToIgnoreCase(name2));

或者,等效但代码更少:

nameColumn.setComparator(String::compareToIgnoreCase);

通常,您为升序排序提供比较器实现。这将直接用于升序排序(替换默认排序算法),并将用于降序排序并反转。

当排序顺序、排序策略或表中项目的适当状态发生变化时,将调用 TableViewsort() 方法,该方法对基于与排序顺序中的列关联的比较器。要更改排序行为,您需要覆盖此方法。从概念上讲,类似于

TableView<MyType> table = new TableView<MyType>() {
    @Override
    public void sort() {
        super.sort();
        showFetchResultsByPage();
    }
};

会给你你想要的,但你需要小心一点,以确保数据列表被正确的方法以正确的顺序访问(以避免并发修改,并可能无限递归)。

关于java - 替换 JavaFX 中的列排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23692958/

相关文章:

java - 需要类、接口(interface)或枚举

javascript - 可以从 JS 客户端获取 POST 请求的 Java 服务器

ios - 启用 ARC 时,NSComparator 在对 NSArray 进行排序时更改行为

java - 无法理解我的书如何计算算法步骤

sorting - 如何理解抽象的就地合并排序

JavaFX 窗口拖动突然且不平滑

javafx - 使用 Path 作为 ProgressBar 的圆角矩形

java - 如何让 Maven 自动重试(从失败的模块恢复)?

java - 转换日期格式不起作用

java - 查看fxml里面的逻辑(特别是迭代)