【问题标题】:JavaFX search in listview列表视图中的 JavaFX 搜索
【发布时间】:2017-07-26 11:46:55
【问题描述】:

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

照片: 原名单:

排序列表:

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

【问题讨论】:

    标签: java listview search javafx-8


    【解决方案1】:

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

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

    【讨论】:

    • 您可能还希望在else 子句中使用setTooltip(null)(否则将鼠标悬停在空单元格上可能会产生奇怪的结果)。
    猜你喜欢
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2011-04-02
    相关资源
    最近更新 更多