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)
但是,当我对表列进行排序时,首先执行表视图的默认排序,然后执行我创建的排序.
有没有办法禁用表视图的默认排序?谢谢
在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)
通常,您为升序排序提供比较器实现.这将直接用于升序排序(替换默认排序算法),并将用于降序排序.
当排序顺序,排序策略,或更改表中的项目的适当状态时,TableView
的sort()
方法被调用的基础上,在排序顺序列相关联的比较器排序.要更改排序行为,您需要覆盖此方法.从概念上讲,就像
TableView<MyType> table = new TableView<MyType>() {
@Override
public void sort() {
super.sort();
showFetchResultsByPage();
}
};
Run Code Online (Sandbox Code Playgroud)
将为您提供您想要的内容,但您需要小心谨慎,以确保正确的方法以正确的顺序访问数据列表(以避免并发修改,并可能无限递归).
归档时间: |
|
查看次数: |
1381 次 |
最近记录: |