目标是过滤tableView。所以,当我输入一些东西来过滤它工作得很好,但是当我点击退格键或删除textField区域上的输入以返回时,tableView显示没有内容在表格中,然后我必须重新启动程序以重新加载并显示数据。数据将从xml文件中保存和加载。
另外,我在Data Class上放置了一个Observale列表来加载和存储contactList,但是在Controller上我有一个类似的过滤器列表,然后控制器将数据类从那里扩展到getContacts并添加filtredList到它。我非常确定问题来自那个
require "nokogiri"
require "open-uri"
url = # your url
doc = Nokogiri::HTML.parse(open(url))
tables = doc.css("table").select do |table|
# consider only the first row of each table
first_row = table.css("tr").first
# check if that row's children contains a <th> element
first_row.children.map(&:name).include?("th")
end
这低于过滤器句柄
public Data() {
contacts = FXCollections.observableArrayList();
}
public ObservableList<Contact> getContacts() {
return contacts;
}
这是init侦听器
public void filterContactList(String oldValue, String newValue) {
ObservableList<Contact> filteredList = FXCollections.observableArrayList();
if (filterInput == null || newValue.length() < oldValue.length() || newValue == null){
contactsTable.setItems(getContacts());
}else {
newValue = newValue.toUpperCase();
for (Contact contact: contactsTable.getItems()){
String filterFirstName = contact.getFirstName();
String filterLastName = contact.getFirstName();
if (filterFirstName.toUpperCase().contains(newValue) || filterLastName.toUpperCase().contains(newValue)){
filteredList.add(contact);
}
}
contactsTable.setItems(filteredList);
}
}
答案 0 :(得分:0)
请为此使用FilteredList
:
private FilteredList<Contact> filteredContacts = new FilteredList<>(getContacts());
...
contactsTable.setItems(filteredList);
...
public void filterContactList(String oldValue, String newValue) {
if (newValue == null) {
filteredContacts.setPredicate(null);
} else {
final String lower = newValue.toLowerCase();
filteredContacts.setPredicte(contact -> contact.getFirstName().toLowerCase().contains(lower) || contact.getLastName().toLowerCase().contains(lower));
}
}
BTW:由于这是从听众调用filterInput
的{{1}},我删除了textProperty
的支票。