在JavaFX中替换列排序

Mar*_*eva 1 java sorting javafx javafx-8

我有一个表视图和表列,我替换了排序.

排序事件:

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

清单分拣机:

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());
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

显示获取的结果:

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));
        }
    });

}
Run Code Online (Sandbox Code Playgroud)

但是,当我对表列进行排序时,首先执行表视图的默认排序,然后执行我创建的排序.

有没有办法禁用表视图的默认排序?谢谢

Jam*_*s_D 8

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

nameColumn.setComparator((name1, name2) -> name1.compareToIgnoreCase(name2));
Run Code Online (Sandbox Code Playgroud)

或者,等效但代码较少:

nameColumn.setComparator(String::compareToIgnoreCase);
Run Code Online (Sandbox Code Playgroud)

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

当排序顺序,排序策略,或更改表中的项目的适当状态时,TableViewsort()方法被调用的基础上,在排序顺序列相关联的比较器排序.要更改排序行为,您需要覆盖此方法.从概念上讲,就像

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

将为您提供您想要的内容,但您需要小心谨慎,以确保正确的方法以正确的顺序访问数据列表(以避免并发修改,并可能无限递归).