Как использовать правила сортировки ICU для сортировки данных в JavaFX TableView?

#javafx-8 #icu

#javafx-8 #icu

Вопрос:

Я хотел использовать правила сортировки ICU для сортировки (строковых) данных в a TableColumn в a TableView с использованием JavaFX и не смог найти пример в Интернете. Вот что сработало для меня. (Я предполагаю, что читатель уже знает, как получить данные в TableView , поскольку это не то, что находится в фокусе.)

Ответ №1:

Сначала мы импортируем ICU RuleBasedCollator на основе правил:

 import com.ibm.icu.text.RuleBasedCollator;
  

Во-вторых, предположим, у нас есть класс Person со строковыми полями имени и фамилии. TableView имеет два табличных столбца, один для первого имени и один для второго имени:

 TableView<Person> personTable;
TableColumn<Person, String> firstNameColumn;
TableColumn<Person, String> lastNameColumn;
  

В-третьих, в методе initialize() контроллера представления добавьте что-то вроде следующего:

 String newRules = "amp; S < C amp; 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. В реальном случае могут быть гораздо более сложные правила.)
Мы создаем ICU, RuleBasedCollator используя правила ICU, а затем создаем Comparator , используя эти правила.
Наконец, мы настроили компаратор полей столбца на использование этого компаратора.