XTableView
provides a filter row with some filter controls. The filter button of a filter control
opens a ContextMenu
with predefined match rules. The selected match rule also appears as prompt text
within the filter control as long as you haven't made any input. The list of available match rules depends on the
based data type - additionally the list can be customized and extended with your own custom rules.
EQUAL
match rule of the birthday filter by calling
FilterModel#setMatchRule(ComparisonType.EQUAL)
.
All screenshots were taken from XTableCustomMatchRuleDemo which can be downloaded from the link below.
XTableColumn dateCol = new XTableColumn<>("Birthday");
...
// regular date filter
dateCol.setColumnFilter(new DateColumnFilter<>());
// set match rule EQUAL as default
dateCol.getColumnFilter().getFilterModel().setMatchRule(ComparisonType.EQUAL);
...
SimplePredicateProvider
constructor has to be set to true.
XTableColumn dateCol = new XTableColumn<>("Birthday");
...
PredicateProvider bornOnSunday = new SimplePredicateProvider<>((value, matchValue) -> value != null ? value.getDayOfWeek() == DayOfWeek.SUNDAY : false, "born on sunday", true);
dateCol.setColumnFilter(new DateColumnFilter(new ComparableFilterModel(FXCollections.observableArrayList(ComparisonType.BEFORE, ComparisonType.AFTER, bornOnSunday))));
...
Note: The resulting table content of the match rule can vary because the birthday data will be randomly created on application startup.
ComparisonType
class.
private PredicateProvider over50 = new SimplePredicateProvider<>((value, matchValue) -> value != null ? value.intValue() > 50 : false, "over 50", true);
...
XTableColumn ageCol = new XTableColumn<>("Age");
...
ObservableList rules = FXCollections.observableArrayList(ComparisonType.values());
rules.addAll(under20, over50);
ageCol.setColumnFilter(new ComparableColumnFilter(new ComparableFilterModel(rules), TextFormatterFactory.INTEGER_TEXTFORMATTER_FACTORY));
Note: The resulting table content of the match rule can vary because the birthday data will be randomly created on application startup.
XTableColumn dateCol = new XTableColumn<>("Birthday");
table.getColumns().addAll(dateCol);
...
// date filter with custom match rules
PredicateProvider bornOnSunday = new SimplePredicateProvider<>((value, matchValue) -> value != null ? value.getDayOfWeek() == DayOfWeek.SUNDAY : false, "born on sunday", true);
dateCol.setColumnFilter(new DateColumnFilter(new ComparableFilterModel(FXCollections.observableArrayList(ComparisonType.BEFORE, ComparisonType.AFTER, bornOnSunday))));
PredicateProvider daysAroundRule = createDaysAroundRule(10);
dateCol.getColumnFilter().getFilterModel().getMatchRules().add(daysAroundRule);
...
private PredicateProvider createDaysAroundRule(int yearsAround)
return new SimplePredicateProvider<>((value, matchValue) -> {
LocalDate lower = matchValue.minusYears(yearsAround);
LocalDate upper = matchValue.plusYears(yearsAround);
return RangeType.ALL_INCLUSIVE.asBiPredicate().test(value, new Boundaries<>(lower, upper));
}, "+/- " + yearsAround + " years");
}
Note: The resulting table content of the match rule can vary because the birthday data will be randomly created on application startup.