Java ListView筛选器仅适用于第一项

Java ListView筛选器仅适用于第一项,java,listview,javafx,Java,Listview,Javafx,我有一个过滤器,可以在包含标签(用户名)数组列表的列表视图中搜索: public void updateList(){ UserDAO=newuserdao(); userList=theDAO.storeUsers(); setItems(用户列表); filterField.textProperty().addListener(新的ChangeListener(){ 公共无效已更改(observeValue observeable、Object oldVal、Object newVal){

我有一个过滤器,可以在包含标签(用户名)数组列表的列表视图中搜索:

public void updateList(){
UserDAO=newuserdao();
userList=theDAO.storeUsers();
setItems(用户列表);
filterField.textProperty().addListener(新的ChangeListener(){
公共无效已更改(observeValue observeable、Object oldVal、Object newVal){
搜索((字符串)oldVal,(字符串)newVal);
}
});
}
公共无效搜索(字符串oldVal、字符串newVal){
如果(oldVal!=null&(newVal.length()
截至目前,我的ListView包含:

试验 123 第三

每当我在“test”中键入任何字母时,它都会成功地过滤掉“third”和“123”,并且在ListView中只显示“test”;当我输入“t”时,它不应该也显示“第三个”吗

此外,当我在过滤器中键入“123”或“third”时,它会过滤掉所有内容


如何修复此问题?

在互联网上搜索时找到了答案-我只是删除了break语句以允许它继续搜索。

在互联网上搜索时找到了答案-我只是删除了break语句以允许它继续搜索。

最好使用
过滤器列表
,而不是使用您可以自己进行筛选。
此外,在大多数情况下,您应该避免在
列表视图
的项目类型中使用
节点
s(
字符串
s通常也应该这样做…。
最后使用类型参数,而不是将项目从
对象
强制转换为
标签
(或其他类)。这允许编译器进行一些类型检查,并且通常会导致代码缩短:

ObservableList<String> originalList = ...
FilteredList<String> filteredList = new FilteredList<>(originalList);

ListView<String> listView = new ListView<>(filteredList);

TextField filterField = new TextField();
filterField.textProperty().addListener((observable, oldValue, newValue) ->  {
    if (newValue.isEmpty()) {
        filteredList.setPredicate(null);
    } else {
        final String searchString = newValue.toUpperCase();
        filteredList.setPredicate(s -> s.toUpperCase().contains(searchString));
    }
});
observeListOriginallist=。。。
FilteredList FilteredList=新的FilteredList(原始列表);
ListView ListView=新的ListView(filteredList);
TextField filterField=新的TextField();
filterField.textProperty().addListener((可观察、旧值、新值)->{
if(newValue.isEmpty()){
setPredicate(null);
}否则{
final String searchString=newValue.toUpperCase();
setPredicate(s->s.toUpperCase().contains(searchString));
}
});

最好使用
FilteredList
而不是自己过滤。
此外,在大多数情况下,您应该避免在
列表视图
的项目类型中使用
节点
s(
字符串
s通常也应该这样做…。
最后使用类型参数,而不是将项目从
对象
强制转换为
标签
(或其他类)。这允许编译器进行一些类型检查,并且通常会导致代码缩短:

ObservableList<String> originalList = ...
FilteredList<String> filteredList = new FilteredList<>(originalList);

ListView<String> listView = new ListView<>(filteredList);

TextField filterField = new TextField();
filterField.textProperty().addListener((observable, oldValue, newValue) ->  {
    if (newValue.isEmpty()) {
        filteredList.setPredicate(null);
    } else {
        final String searchString = newValue.toUpperCase();
        filteredList.setPredicate(s -> s.toUpperCase().contains(searchString));
    }
});
observeListOriginallist=。。。
FilteredList FilteredList=新的FilteredList(原始列表);
ListView ListView=新的ListView(filteredList);
TextField filterField=新的TextField();
filterField.textProperty().addListener((可观察、旧值、新值)->{
if(newValue.isEmpty()){
setPredicate(null);
}否则{
final String searchString=newValue.toUpperCase();
setPredicate(s->s.toUpperCase().contains(searchString));
}
});