JavaFX8将谓词绑定改为按键操作

JavaFX8将谓词绑定改为按键操作,javafx,tableview,Javafx,Tableview,我有一个表格视图,每列都有文本框。如果我在其中一个文本框中写入内容,tableview将根据所有文本框进行过滤。目前,我的代码监听文本框中的更改,并在文本更改时进行过滤。下面的代码工作得很好,但是有什么方法可以提高效率吗 也许最好的方法是听回车键,而不是过滤文本字段中的每一个更改?predicateProperty支持这一点吗?如果不是,我如何从predicateProperty/binding改为onKey press filteredItems.predicateProperty().bin

我有一个表格视图,每列都有文本框。如果我在其中一个文本框中写入内容,tableview将根据所有文本框进行过滤。目前,我的代码监听文本框中的更改,并在文本更改时进行过滤。下面的代码工作得很好,但是有什么方法可以提高效率吗

也许最好的方法是听回车键,而不是过滤文本字段中的每一个更改?predicateProperty支持这一点吗?如果不是,我如何从predicateProperty/binding改为onKey press

filteredItems.predicateProperty().bind(Bindings.createObjectBinding(()
            -> li -> {
                for (int i = 0; i < li.size(); i++) {
                    {
                        if (!li.get(i).toLowerCase().
                        contains(
                                listOfTxtFields.get(i).getText().toLowerCase()
                        )) {
                            return false;
                        }

                    }

                }
                return true;
            },
            listOfTxtFields.stream().map(TextField::textProperty)
            .collect(Collectors.toList())
            .toArray(new StringProperty[listOfTxtFields.size()])));
filteredItems.predicateProperty().bind(Bindings.createObjectBinding()
->李->{
对于(int i=0;i
实际上,我通过一些实验解决了这个问题。这是非常有效的,但是当它变成成吨的行时可能会快一点,所以如果你有任何加快速度的建议,我很乐意听到。这就是我所做的:

创建了一个方法,该方法将在用户每次在列中的文本字段上按enter键时调用:

空过滤器(){

DateTest DateTest=new DateTest();
filteredItems.setPredicate(li->{
对于(int i=0;i
可能是eventfilter解决方案吗?加载lambda的速度也很慢,但原因是我的日期检查器很丑。。还有什么建议吗?
    DateTest dateTest = new DateTest();
    filteredItems.setPredicate(li -> {

        for (int i = 0; i < li.size(); i++) {
            if (dateTest.isValidDate(listOfTxtFields.get(i).getText().replace("a", "").replace("b", ""))) {

                try {
                    dateTest.isValidDate(li.get(i));
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    Date date1 = sdf.parse(li.get(i));
                    Date date2 = sdf.parse(listOfTxtFields.get(i).getText().replace("a", "").replace("b", ""));
                    if (listOfTxtFields.get(i).getText().contains("a")) {
                        if (date1.after(date2)) {
                            return true;

                        }
                    }
                    if (listOfTxtFields.get(i).getText().contains("b")) {
                        if (!date1.before(date2)) {
                            return false;
                        }
                    } else {
                        if (!date1.equals(date2)) {
                            return false;
                        }
                    }
                } catch (ParseException ex) {
                    Logger.getLogger(Table.class.getName()).log(Level.SEVERE, null, ex);
                }

            } else {
                if (!li.get(i).toLowerCase().
                        contains(
                                listOfTxtFields.get(i).getText().toLowerCase()
                        )) {

                    return false;

                }
            }
        }

        return true;
    });

}