【问题标题】:Execute code on filtering JavaFX TableView rows执行过滤 JavaFX TableView 行的代码
【发布时间】:2017-02-28 22:27:32
【问题描述】:

我正在使用 TextFiled 过滤 JavaFX TableView 的行,这会导致设置为 TableView 的 SortedList 并且它可以工作,我还创建了一个函数,该函数将该 SortedList 作为参数来执行其他操作,问题是虽然过滤在表格中生效,但 SortedList 没有改变值,这是否意味着过滤隐藏了行而不是将它们从 TableView 初始列表中删除,请帮助,这是我的代码:

FilteredList<CommandeFX> filteredData = new FilteredList<>(data, p -> true);

    // 2. Set the filter Predicate whenever the filter changes.
    filterField.textProperty().addListener((observable, oldValue, newValue) -> {
        filteredData.setPredicate(commande -> {
            // If filter text is empty, display all persons.
            if (newValue == null || newValue.isEmpty()) {
                return true;
            }

            // Compare first name and last name of every person with filter text.
            String lowerCaseFilter = newValue.toLowerCase();

            if (String.valueOf(commande.getCodeCommande()).toLowerCase().contains(lowerCaseFilter)) {
                return true;
                 // Filter matches first name.

            } else if (String.valueOf(commande.getCMD()).toLowerCase().contains(lowerCaseFilter)) {
                return true; // Filter matches last name.
            }
            else if (String.valueOf(commande.getClient()).toLowerCase().contains(lowerCaseFilter)) {                                  
                return true; // Filter matches last name.
            }
            else if (String.valueOf(commande.getFournisseur()).toLowerCase().contains(lowerCaseFilter)) {
                return true; // Filter matches last name.
            }
            else if (String.valueOf(commande.getQuantite()).toLowerCase().contains(lowerCaseFilter)) {
                return true; // Filter matches last name.
            }
            else if (String.valueOf(commande.getPrixCommande()).toLowerCase().contains(lowerCaseFilter)) {
                return true; // Filter matches last name.
            }
            else if (String.valueOf(commande.getSommeProperty()).toLowerCase().contains(lowerCaseFilter)) {
                return true; // Filter matches last name.
            }
            else if (String.valueOf(commande.getResteCommandeProperty()).toLowerCase().contains(lowerCaseFilter)) {
                return true; // Filter matches last name.
            }
            else if (String.valueOf(commande.getDateCommande()).toLowerCase().contains(lowerCaseFilter)) {
                return true; // Filter matches last name.
            }
            else if (String.valueOf(commande.getDateReception()).toLowerCase().contains(lowerCaseFilter)) {
                return true; // Filter matches last name.
            }
            else if (String.valueOf(commande.getModified()).toLowerCase().contains(lowerCaseFilter)) {
                return true; // Filter matches last name.
            }
            else if (String.valueOf(commande.getValide()).toLowerCase().contains(lowerCaseFilter)) {
                return true; // Filter matches last name.
            }

            return false; // Does not match.
        });
    });


    // 3. Wrap the FilteredList in a SortedList. 
    SortedList<CommandeFX> sortedData = new SortedList<>(filteredData);    

    // 4. Bind the SortedList comparator to the TableView comparator.
    sortedData.comparatorProperty().bind(tableCommandes.comparatorProperty());
    // 5. Add sorted (and filtered) data to the table.
    tableCommandes.setItems(sortedData);
    // the function 
    setSum(sortedData);

【问题讨论】:

  • 排序列表应该包含与过滤列表相同的元素 - 即您应该会看到过滤的结果。实际发生了什么让您认为它不起作用?
  • 我看到了过滤的结果,过滤后的列表总是与原始列表大小相同,这是我的问题,但不再是因为这意味着与过滤器不匹配的行设置为空,这可以解决我的问题,谢谢!
  • 我并没有真正遵循这一点。问题是什么?还是你没有问题了?
  • 在将排序列表添加到其中后,我需要遍历 TableView 行,因此我只能处理可见行。
  • for (CommandeFX c : sortedData) { ... }

标签: java javafx filter tableview rows


【解决方案1】:

实际上,我没有注意到每次在过滤器文本字段中键入时要调用的函数不在正确的位置。现在函数getSum(SortedList Commande&lt;FX&gt; list) 在我输入过滤器时被实时调用。这是正确的代码:

FilteredList<CommandeFX> filteredData = new FilteredList<>(data, p -> true);

// 2. Set the filter Predicate whenever the filter changes.
filterField.textProperty().addListener((observable, oldValue, newValue) -> {
    filteredData.setPredicate(commande -> {
        // If filter text is empty, display all persons.
        if (newValue == null || newValue.isEmpty()) {
            return true;
        }

        // Compare first name and last name of every person with filter text.
        String lowerCaseFilter = newValue.toLowerCase();

        if (String.valueOf(commande.getCodeCommande()).toLowerCase().contains(lowerCaseFilter)) {
            return true;
             // Filter matches first name.

        } else if (String.valueOf(commande.getCMD()).toLowerCase().contains(lowerCaseFilter)) {
            return true; // Filter matches last name.
        }
        else if (String.valueOf(commande.getClient()).toLowerCase().contains(lowerCaseFilter)) {                                  
            return true; // Filter matches last name.
        }
        else if (String.valueOf(commande.getFournisseur()).toLowerCase().contains(lowerCaseFilter)) {
            return true; // Filter matches last name.
        }
        else if (String.valueOf(commande.getQuantite()).toLowerCase().contains(lowerCaseFilter)) {
            return true; // Filter matches last name.
        }
        else if (String.valueOf(commande.getPrixCommande()).toLowerCase().contains(lowerCaseFilter)) {
            return true; // Filter matches last name.
        }
        else if (String.valueOf(commande.getSommeProperty()).toLowerCase().contains(lowerCaseFilter)) {
            return true; // Filter matches last name.
        }
        else if (String.valueOf(commande.getResteCommandeProperty()).toLowerCase().contains(lowerCaseFilter)) {
            return true; // Filter matches last name.
        }
        else if (String.valueOf(commande.getDateCommande()).toLowerCase().contains(lowerCaseFilter)) {
            return true; // Filter matches last name.
        }
        else if (String.valueOf(commande.getDateReception()).toLowerCase().contains(lowerCaseFilter)) {
            return true; // Filter matches last name.
        }
        else if (String.valueOf(commande.getModified()).toLowerCase().contains(lowerCaseFilter)) {
            return true; // Filter matches last name.
        }
        else if (String.valueOf(commande.getValide()).toLowerCase().contains(lowerCaseFilter)) {
            return true; // Filter matches last name.
        }

        return false; // Does not match.
    });



      // 3. Wrap the FilteredList in a SortedList. 
      SortedList<CommandeFX> sortedData = new SortedList<>(filteredData);    

      // 4. Bind the SortedList comparator to the TableView comparator.
  sortedData.comparatorProperty().bind(tableCommandes.comparatorProperty());
     // 5. Add sorted (and filtered) data to the table.
     tableCommandes.setItems(sortedData);
     // the function 
     setSum(sortedData);

});

【讨论】:

    猜你喜欢
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2014-12-14
    • 2022-01-18
    • 1970-01-01
    • 2015-02-01
    相关资源
    最近更新 更多