JavaFX8改为从谓词绑定到KeyPress操作

时间:2014-10-23 08:30:52

标签: javafx tableview

我在每列中都有一个带有文本框的TableView。如果我在其中一个文本框中写入内容,则会根据所有文本框过滤tableview。现在,我听到的代码会在文本框中进行更改,并在文本更改时立即进行过滤。以下代码工作正常,但它是否可以使它更有效?

可能最好的方法是收听输入按键而不是过滤文本字段中的每个更改? predicateProperty支持这个吗?如果没有,我怎样才能从谓词属性/绑定更改为onKey按?

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()])));

1 个答案:

答案 0 :(得分:0)

我实际上是通过一些实验来解决这个问题。它非常有效,但当它变成很多行时可能会更快一点,所以如果你有任何建议让它更快,我很乐意听到它们。这就是我所做的:

创建一个方法,每次用户在列中的textField上按Enter键时都会调用该方法:

void filter(){

    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;
    });

}