javafx-8 - 如何使用 ICU 排序规则对 JavaFX TableView 中的数据进行排序?
问题描述
我想使用 ICU 排序规则对使用 JavaFX 中的(字符串)数据进行排序,但TableColumn
在TableView
网上找不到示例。这对我有用。(我假设读者已经知道如何获取数据,TableView
因为这不是重点。)
解决方案
首先,我们导入一个 ICU RuleBasedCollator:
import com.ibm.icu.text.RuleBasedCollator;
其次,假设我们有一个 Person 类,其中包含名字和姓氏字符串字段。TableView 有两个 TableColumn,一个用于第一个名称,一个用于第二个名称:
TableView<Person> personTable;
TableColumn<Person, String> firstNameColumn;
TableColumn<Person, String> lastNameColumn;
第三,在视图控制器的 initialize() 方法中,添加如下内容:
String newRules = "& S < C & Mu < Mue";
RuleBasedCollator collatorViaRules = new RuleBasedCollator(newRules);
Comparator<String> comparatorViaRules = Comparator.comparing(String::toString, collatorViaRules);
firstNameColumn.setComparator((String s1, String s2) -> {
return comparatorViaRules.compare(s1, s2);
});
lastNameColumn.setComparator((String s1, String s2) -> {
return comparatorViaRules.compare(s1, s2);
});
中的两个 ICU 规则newRules
将任何 C 放在 S 之后,并将 Mu... 放在 Mue 之前。(这些在这里并不是很有意义;它们是为了查看是否应用了 ICU 规则。真实案例可能有更复杂的规则。)我们RuleBasedCollator
使用 ICU 规则创建一个 ICU,然后Comparator
使用这些规则创建一个。最后,我们设置列字段的比较器来使用这个比较器。
推荐阅读
- python - 网页的二级动态抓取
- node.js - 在 iisnode webconfig 中找不到运行在 iis 服务器中的 Socket 来运行 socket.io
- python - 升级后 pip 出错:“模块”对象没有属性“SSL_ST_INIT”
- ruby-on-rails - 使用 Redis 作为会话存储是否会减轻会话重放攻击?
- oracle - 识别值从先前版本更改的列
- java - Android - 在 RecyclerView 中更新 TextClock 的时间格式(12/24 小时格式)
- php - 使用特殊字符时 POST 联系表单缺少数据
- django - 带有附加模型的 Django m2m_changed 信号
- jstree - jsTree 获取节点的兄弟姐妹
- c# - ASP.Net - 在 ModelBinder 中获取 actionmethod 的 ParameterInfo 或 ParameterBindingInfo