我有一个 observableArrayList,其中包含来自 DDBB 的数据。列表中的每个项目都有一个 Date 属性。我使用 TableView 来显示 observableArrayList 数据。
datos = observableArrayList();
datos.addAll(new TablaDAO().obtenItems()); //Get all items without any filter (I show this by default)
默认情况下,用户查看所有项目,但我有一个 ChoiceBox,用户可以在其中选择一个时间段(例如,过去 30 天)并根据用户的选择,仅表格 显示日期小于 30 天的行。
chFiltrar.getSelectionModel().selectedIndexProperty().addListener((ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {
if (newValue.intValue() == 0) { //30 days
//I need to show only items where date<last 30 days
} else if (newValue.intValue() == 2) { //All days
//This option works well because I show all items
}
});
我找到了与使用 FilteredList 相关的答案,但大多数情况是根据属性中的关键字搜索进行过滤。
最佳答案
使用FilteredList
是正确的方法。你会做类似的事情
datos = observableArrayList();
datos.addAll(new TablaDAO().obtenItems()); //Get all items without any filter (I show this by default)
FilteredList<Date> filteredList = new FilteredList<>(datos);
table.setItems(filteredList);
然后
chFiltrar.getSelectionModel().selectedIndexProperty().addListener((ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {
if (newValue.intValue() == 0) { //30 days
//I need to show only items where date<last 30 days
Calendar now = Calendar.getInstance();
filteredList.setFilter(date -> {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return now.add(Calendar.DAY_OF_MONTH, -30).before(date);
});
} else if (newValue.intValue() == 2) { //All days
//This option works well because I show all items
filteredList.setFilter(date -> true);
}
});
我强烈建议重写您的代码以使用新的 java.time
API,而不是旧的 java.util.Date
和 Calendar
类。
关于java - 基于 ChoiceBox 选择过滤 observableArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26198416/