在列表视图中搜索 JavaFX

Lás*_*iki 3 java search listview javafx-8

我想在列表视图中搜索,我的代码可以工作,但还不够好。问题是,当我在搜索文本字段中写入几个字符时,不仅会出现结果,而且其余项目也会出现......

代码:

// 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);
Run Code Online (Sandbox Code Playgroud)

照片: 原清单: 原始清单

排序列表: 排序列表

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;
        }
    });
Run Code Online (Sandbox Code Playgroud)

joh*_*384 5

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

我认为您的实现很糟糕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("");
              }
          }
        };
Run Code Online (Sandbox Code Playgroud)

  • 您可能还希望在“else”子句中使用“setTooltip(null)”(否则将鼠标悬停在空单元格上可能会产生奇怪的结果)。 (2认同)