根据ChoiceBox选择过滤observableArrayList

时间:2014-10-05 00:16:18

标签: java javafx-8

我有一个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相关的答案,但大多数情况下都要根据属性中的关键字搜索来过滤。

1 个答案:

答案 0 :(得分:0)

使用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.DateCalendar类。