我有一个 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);
通常,您为升序排序提供比较器实现。这将直接用于升序排序(替换默认排序算法),并将用于降序排序并反转。
当排序顺序、排序策略或表中项目的适当状态发生变化时,将调用 TableView
的 sort()
方法,该方法对基于与排序顺序中的列关联的比较器。要更改排序行为,您需要覆盖此方法。从概念上讲,类似于
TableView<MyType> table = new TableView<MyType>() {
@Override
public void sort() {
super.sort();
showFetchResultsByPage();
}
};
会给你你想要的,但你需要小心一点,以确保数据列表被正确的方法以正确的顺序访问(以避免并发修改,并可能无限递归)。
关于java - 替换 JavaFX 中的列排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23692958/