JavaFX | TableView特定列的总和

huangapple 未分类评论45阅读模式
英文:

JavaFX| TableView sum of specific column

问题

我有一个带有筛选器的表格视图。其中一个是日期范围(起始日期,结束日期),另一个是名称筛选器。
我想在实时应用筛选器时计算特定列中的数据总和。我该如何实现?

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        loadSalesReports(); // 从数据库中加载数据并保存在类级别的ArrayList savedLubesSalesReportsList 中
        FilteredList<LubesSalesReport> filteredData = new FilteredList<>(FXCollections.observableArrayList(savedLubesSalesReportsList), p -> true);
        // DatePicker txtEndDate(日期筛选的最大范围)
        txtEndDate.getEditor().textProperty().addListener((observable, oldValue, newValue) -> {
            filteredData.setPredicate(pumpData -> {
                // 按日期筛选
                if (pumpData.getDate().before(dateTo) || pumpData.getDate().equals(dateTo)) {
                    if (pumpData.getDate().after(dateFrom) || pumpData.getDate().equals(dateFrom)) {
                        // 在这里进行计算总和
                        double total = 0;
                        for(LubesSalesReport lsr : tblLubesReport.getItems()){
                            total = total + lsr.getAmount();
                        }
                        txtTotal.setText(String.valueOf(total));
                        return true; // 这将根据日期筛选表格,但不会在筛选后计算新的总和
                    }
                }
                return false; 
            });
        });
        SortedList<LubesSalesReport> sortedData = new SortedList<>(filteredData);
        sortedData.comparatorProperty().bind(tblLubesReport.comparatorProperty());
        // TableView<LubesSalesReport> tblLubesReport;
        tblLubesReport.setItems(sortedData);
        for (int i = 0; i < savedLubesSalesReportsList.size(); i++) {
                  // 表格的列
        }
        // 显示整个表格的初始总和,按预期工作
        double total = 0;
        for(LubesSalesReport lsr : tblLubesReport.getItems()){
            total = total + lsr.getAmount();
        }
        txtTotal.setText(String.valueOf(total));
    }

当我设置结束日期时,表格被筛选,但新的总和计算不会显示(仍然显示初始值)。我该如何解决这个问题?我尝试在筛选方法中的 return 之前添加总和,这在我看来是有道理的。我漏掉了什么?我应该怎么做?谢谢。

英文:

I have a tableview with filters. One is a date range (from, to) and the other is a name filter.
I want to calculate the sum of data in a particular column even when i'm applying filters in real time. How can I achieve this?

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        loadSalesReports(); //saves the data from database in class level arrayList = savedLubesSalesReportsList
        FilteredList&lt;LubesSalesReport&gt; filteredData = new FilteredList&lt;&gt;(FXCollections.observableArrayList(savedLubesSalesReportsList), p -&gt; true);
        //DatePicker txtEndDate (max range of date filter)
        txtEndDate.getEditor().textProperty().addListener((observable, oldValue, newValue) -&gt; {
            filteredData.setPredicate(pumpData -&gt; {
                    //filters by dates
                if (pumpData.getDate().before(dateTo) || pumpData.getDate().equals(dateTo)) {
                    if (pumpData.getDate().after(dateFrom) || pumpData.getDate().equals(dateFrom)) {
                        //calculate sum here
                        double total = 0;
                        for(LubesSalesReport lsr:tblLubesReport.getItems()){
                            total = total+lsr.getAmount();
                        }
                        txtTotal.setText(String.valueOf(total));
                        return true; //this filters table by dates but doesn;t calculate new sum after filter
                    }
                }
                return false; 
            });
        });
        SortedList&lt;LubesSalesReport&gt; sortedData = new SortedList&lt;&gt;(filteredData);
        sortedData.comparatorProperty().bind(tblLubesReport.comparatorProperty());
        //TableView&lt;LubesSalesReport&gt; tblLubesReport;
        tblLubesReport.setItems(sortedData);
        for (int i = 0; i &lt; savedLubesSalesReportsList.size(); i++) {
                  //columns for table
        }
        //displays initial sum for entire table, works as intended
        double total = 0;
        for(LubesSalesReport lsr:tblLubesReport.getItems()){
            total = total+lsr.getAmount();
        }
        txtTotal.setText(String.valueOf(total));
    }

When I set the end date, my table is filtered, but new sum calculation isn't shown (displays initial one instead). How may I resolve this? I just tried adding the sum in the filter method before they return, it's what made sense to me. What am I missing? What should I do? Thanks

huangapple
  • 本文由 发表于 2020年4月8日 20:53:44
  • 转载请务必保留本文链接:https://java.coder-hub.com/61101161.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定