我在每列中都有一个带有文本框的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()])));
答案 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;
});
}