ListView 中的 JavaFX 搜索

标签 java listview search javafx-8

我想在 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);

照片: 原 list : Original list

排序列表: Sorted list

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

最佳答案

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

我认为您有一个糟糕的 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("");
              }
          }
        };

关于 ListView 中的 JavaFX 搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42628472/

相关文章:

java - 使用java将HTML转换为图像

java - 如何设置 JPA EntityManager 查询的超时时间

Java JCheckBox Action 监听器

java - ListView 中的 ImageView 忽略所有布局尺寸并填满整个屏幕

android - 单击列表项时如何使用列表项设置 TextView 的文本

string - Lua - 得到所有的单词

mysql - 按属性搜索的最佳数据库类型和架构

java - 无法合并Dex

java - ListView 不显示 -- ListView 项目选择到 webView

PHP使用通配符搜索数组?