JavaFX FilteredList, filtering based on property of items in the list

前端 未结 2 496
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-21 07:45

I have a case where I need to filter a ObservableList based on some properties of the items (i.e. the condition is internal and not external). I fou

2条回答
  •  孤城傲影
    2020-12-21 08:20

    If you are using database loading function plus need to filter multiple fields, this solution will help.

     ObservableList poData = FXCollections.observableArrayList();
     FilteredList filteredData;
      private void load()  {
            PurchaseOrder po = new PurchaseOrder();
            try {
                poData = po.loadTable("purchase_orders", beanFields); // Database loading data
            } catch (SQLException ex) {
                Logger.getLogger(PurchaseOrdersController.class.getName()).log(Level.SEVERE, null, ex);
            }
    
            filteredData = new FilteredList<>(poData, t -> true); //Encapsulate data with filter
    
            poTable.setItems(filteredData); //Load filtered data into table
    
            //Set event trigger for all filter textboxes
            txtFilter.textProperty().addListener(obs->{
                filter(filteredData);
            });
            txtFilter2.textProperty().addListener(obs->{
                filter(filteredData);
            });
      }
    
       private void filter(FilteredList filteredData)
        {
                filteredData.setPredicate(PurchaseOrder -> {
                    // If all filters are empty then display all Purchase Orders
                    if ((txtFilter.getText() == null || txtFilter.getText().isEmpty()) 
                            && (txtFilter2.getText() == null || txtFilter2.getText().isEmpty())) {
                        return true;
                    }
    
                    // Convert filters to lower case
                    String lowerCaseFilter = txtFilter.getText().toLowerCase();
                    String lowerCaseFilter2 = txtFilter2.getText().toLowerCase();
    
                    //If fails any given criteria, fail completely
                    if(txtFilter.getText().length()>0)
                        if (PurchaseOrder.get("vendor_name").toLowerCase().contains(lowerCaseFilter) == false)
                            return false;
                    if(txtFilter2.getText().length()>0)
                        if (PurchaseOrder.get("PONumber").toLowerCase().contains(lowerCaseFilter2) == false)
                            return false;
    
                    return true; // Matches given criteria
                });
        }
    

提交回复
热议问题