2017-03-06 91 views
0

我想在listview中搜索,我的代碼正在工作,但不夠好。問題是,當我寫在搜索文本字段不僅結果出現幾個字符,但也出現過項目的其餘部分...JavaFX在列表視圖中搜索

代碼:

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

照片: 原始列表: 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; 
     } 
    }); 

謝謝,對不起英文不好!

+0

添加代碼(如果有的話)... – john16384

+0

@ john16384添加 –

回答

2

你的問題不在你的過濾器邏輯中。

我認爲你有一個不好的ListCell實現,當它應該不顯示任何內容時,它不會清除它的文本。

更新

呀,你的渲染器時,產品null不清除細胞。嘗試是這樣的:對的ListCell實施

 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(""); 
       } 
      } 
     }; 
+0

謝謝!這是問題:D –

+0

您可能還希望'else'子句中的'setTooltip(null)'(否則懸停在空單元格上可能會產生奇怪的結果)。 –