listview中的JavaFX搜索

listview中的JavaFX搜索,java,listview,search,javafx-8,Java,Listview,Search,Javafx 8,我想在listview中搜索,我的代码工作正常,但不够好。问题是,当我在搜索文本字段中写几个字符时,不仅结果会出现,其余的项目也会出现 守则: // Wrap the ObservableList in a FilteredList (initially display all data). FilteredList<Client> filteredData = new FilteredList<>(main.getClientListData(),p ->

我想在listview中搜索,我的代码工作正常,但不够好。问题是,当我在搜索文本字段中写几个字符时,不仅结果会出现,其余的项目也会出现

守则:

// Wrap the ObservableList in a FilteredList (initially display all data).
    FilteredList<Client> filteredData = new FilteredList<>(main.getClientListData(),p -> true);

    //Set the filter Predicate whenever the filter changes.
    searchUserTF.textProperty().addListener((observable, oldValue, newValue) -> {
        filteredData.setPredicate(client ->{
            // If filter text is empty, display all persons.
            if(newValue == null || newValue.isEmpty()){
                return true;
            }

            // Compare first name and last name of every client with filter text.
            String lowerCaseFilter = newValue.toLowerCase();

            if(client.getFirstname().toLowerCase().contains(lowerCaseFilter)){
                return true; //filter matches first name
            }else if(client.getLastname().toLowerCase().contains(lowerCaseFilter)){
                return true; //filter matches last name
            }
            return false; //Does not match
        });
    });

    //Wrap the FilteredList in a SortedList.
    SortedList<Client> sortedData = new SortedList<>(filteredData);

    //put the sorted list into the listview
    clientListView.setItems(sortedData);
//将ObservableList包装在FilteredList中(最初显示所有数据)。
FilteredList filteredData=新的FilteredList(main.getClientListData(),p->true);
//每当过滤器更改时,设置过滤器谓词。
searchUserTF.textProperty().addListener((可观察、旧值、新值)->{
setPredicate(客户端->{
//如果筛选文本为空,则显示所有人员。
if(newValue==null | | newValue.isEmpty()){
返回true;
}
//将每个客户端的名字和姓氏与筛选器文本进行比较。
字符串lowerCaseFilter=newValue.toLowerCase();
if(client.getFirstname().toLowerCase().contains(lowerCaseFilter)){
返回true;//筛选器与名字匹配
}else if(client.getLastname().toLowerCase().contains(lowerCaseFilter)){
返回true;//筛选器与姓氏匹配
}
返回false;//不匹配
});
});
//将FilteredList包装在一个SortedList中。
SortedList sortedData=新的SortedList(filteredData);
//将排序后的列表放入listview
setItems(sortedData);
照片: 原始清单:

已排序列表:

更新! ListCell实现:

 clientListView.setCellFactory(new Callback<ListView<Client>, ListCell<Client>>() {
        @Override
        public ListCell<Client> call(ListView<Client> param) {
            final Label leadLbl = new Label();
            final Tooltip tooltip = new Tooltip();
            final ListCell<Client> cell = new ListCell<Client>(){
              @Override
                public void updateItem(Client item, boolean empty){
                  super.updateItem(item,empty);
                  if(item != null){
                      leadLbl.setText(item.getFirstname());
                      setText(item.getFirstname()+" "+item.getLastname());
                      tooltip.setText(item.getFirstname());
                      setTooltip(tooltip);
                  }
              }
            };
            return cell;
        }
    });
clientListView.setCellFactory(新回调(){
@凌驾
公共ListCell调用(ListView参数){
最终标签引线Lbl=新标签();
最终工具提示工具提示=新工具提示();
最终ListCell单元格=新ListCell(){
@凌驾
public void updateItem(客户端项,布尔值为空){
super.updateItem(项,空);
如果(项!=null){
leadLbl.setText(item.getFirstname());
setText(item.getFirstname()+“”+item.getLastname());
tooltip.setText(item.getFirstname());
设置工具提示(工具提示);
}
}
};
返回单元;
}
});

谢谢,抱歉英语不好

您的问题不在过滤器逻辑中

我认为您有一个糟糕的
ListCell
实现,当它应该什么也不显示时,它不会清除文本

更新

是的,当项目为
null
时,单元格渲染器不会清除单元格。试着这样做:

        final ListCell<Client> cell = new ListCell<Client>(){
          @Override
            public void updateItem(Client item, boolean empty){
              super.updateItem(item,empty);
              if(item != null){
                  leadLbl.setText(item.getFirstname());
                  setText(item.getFirstname()+" "+item.getLastname());
                  tooltip.setText(item.getFirstname());
                  setTooltip(tooltip);
              }
              else {
                  leadLbl.setText("");
                  setText("");
              }
          }
        };
final ListCell cell=new ListCell(){
@凌驾
public void updateItem(客户端项,布尔值为空){
super.updateItem(项,空);
如果(项!=null){
leadLbl.setText(item.getFirstname());
setText(item.getFirstname()+“”+item.getLastname());
tooltip.setText(item.getFirstname());
设置工具提示(工具提示);
}
否则{
leadLbl.SETEXT(“”);
setText(“”);
}
}
};

为ListCell实现添加代码(如果有)…@john16384 addedHanks!这就是问题所在:DYou可能还希望在
else
子句中使用
setTooltip(null)
(否则将鼠标悬停在空单元格上可能会产生奇怪的结果)。