Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用过滤计算Vaadin 8网格页脚中的总计_Java_Vaadin_Vaadin8_Vaadin Grid - Fatal编程技术网

Java 如何使用过滤计算Vaadin 8网格页脚中的总计

Java 如何使用过滤计算Vaadin 8网格页脚中的总计,java,vaadin,vaadin8,vaadin-grid,Java,Vaadin,Vaadin8,Vaadin Grid,我知道我必须使用grid.getDataProvider()来获取ListDataProvider(假设我向grid.setItems()发送了List)。在其他情况下,要计算页脚总数,我需要: Collection myItems = ((ListDataProvider)grid.getDataProvider()).getItems(); for(MyItem myItem : myItems) total += myItem.getValue(); footer.getCell(f

我知道我必须使用
grid.getDataProvider()
来获取
ListDataProvider
(假设我向
grid.setItems()发送了
List
)。在其他情况下,要计算页脚总数,我需要:

Collection myItems = ((ListDataProvider)grid.getDataProvider()).getItems();
for(MyItem myItem : myItems)
   total += myItem.getValue();
footer.getCell(footerCell).setText(format(total));
但如果我添加一个页脚,这将失败,因为它会计算网格中的所有项目。例如,如果我添加:

((ListDataProvider)grid.getDataProvider()).addFilter(myFilter);
顶部的代码失败,因为页脚不是已过滤的总计,而是完整的网格总计

也就是说:

但是,这是一种受保护的方法。假设我创建了自己的子类,我甚至不知道该方法是如何工作的

但即便如此,这似乎过于复杂,应该简单一些,特别是如果有能力在网格中添加过滤的话


因此,我的大问题是,如果过滤网格,如何计算Vaadin 8网格中的页脚总数?

要重新计算总数,可以使用过滤器更改时触发的。在其实现中,您可以使用从中提取项,因为fetch方法还考虑了您定义的过滤器

下面的示例主要基于,其思想是显示每月报价及其总数的列表。过滤器将允许您查看从某个月开始的数据(这很愚蠢,但它会让您开始):

import com.vaadin.data.provider.ListDataProvider;
导入com.vaadin.data.provider.Query;
导入com.vaadin.ui.ComboBox;
导入com.vaadin.ui.Grid;
导入com.vaadin.ui.VerticalLayout;
导入com.vaadin.ui.components.grid.FooterRow;
导入com.vaadin.ui.components.grid.HeaderRow;
导入com.vaadin.ui.themes.ValoTheme;
导入java.util.List;
导入java.util.Random;
导入java.util.stream.collector;
导入java.util.stream.IntStream;
公共类FilteredGrid扩展了垂直布局{
公共过滤器网格(){
//列出包含一些随机数据的数据提供程序
随机=新随机();
List quotes=IntStream.range(1,11).mapToObj(month->new Quote(month,random.nextInt(10)).collect(Collectors.toList());
ListDataProvider provider=新的ListDataProvider(引号);
//月数过滤器组合
ComboBox monthFilterCombo=新的组合框(“从”,IntStream.range(1,10).boxed().collect(Collectors.toList())开始);
monthFilterCombo.setEmptySelectionCaption(“全部”);
monthFilterCombo.addStyleName(ValoTheme.COMBOBOX_SMALL);
monthFilterCombo.addValueChangeListener(事件->{
if(event.getValue()==null){
provider.clearFilters();
}否则{
provider.setFilter(quote->quote.getMonth()>event.getValue());
}
});
//网格设置
网格网格=新网格(Quote.class);
grid.setDataProvider(provider);
//页眉和页脚
HeaderRow header=grid.appendHeaderRow();
header.getCell(“月”).setComponent(monthFilterCombo);
FooterRow footer=grid.prependFooterRow();
footer.getCell(“月”).setHtml(“总计”);
provider.addDataProviderListener(事件->footer.getCell(“值”).setHtml(calculateTotal(provider));
//将网格添加到用户界面
设置大小();
grid.setSizeFull();
添加组件(网格);
//触发初始计算
provider.refreshAll();
}
//计算已过滤数据的总数
私有字符串calculateTotal(ListDataProvider提供程序){
返回“+String.valueOf(provider.fetch(new Query()).mapToInt(Quote::getValue.sum())+”;
}
//简单绑定的基本bean
公开课报价{
私人整数月;
私有int值;
公开报价(整数月,整数值){
本月=月;
这个值=值;
}
公共整数getMonth(){
返回月份;
}
公共无效设置月(整数月){
本月=月;
}
public int getValue(){
返回值;
}
公共无效设置值(int值){
这个值=值;
}
}
}
结果:


谢谢。我缺少的关键部分是执行新查询()的能力。我不知道你能这么做。我假设如果它不是必需的,那么它就不是一个参数,默认情况下会在API中为您创建一个空查询之类的东西。无论如何,谢谢你,这工作做得很好!!
grid.getDataCommunicator().fetchItemsWithRange(...);
import com.vaadin.data.provider.ListDataProvider;
import com.vaadin.data.provider.Query;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Grid;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.components.grid.FooterRow;
import com.vaadin.ui.components.grid.HeaderRow;
import com.vaadin.ui.themes.ValoTheme;

import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class FilteredGrid extends VerticalLayout {
    public FilteredGrid() {
        // list data provider with some random data
        Random random = new Random();
        List<Quote> quotes = IntStream.range(1, 11).mapToObj(month -> new Quote(month, random.nextInt(10))).collect(Collectors.toList());
        ListDataProvider<Quote> provider = new ListDataProvider<>(quotes);

        // month number filter combo
        ComboBox<Integer> monthFilterCombo = new ComboBox<>("Starting with", IntStream.range(1, 10).boxed().collect(Collectors.toList()));
        monthFilterCombo.setEmptySelectionCaption("All");
        monthFilterCombo.addStyleName(ValoTheme.COMBOBOX_SMALL);
        monthFilterCombo.addValueChangeListener(event -> {
            if (event.getValue() == null) {
                provider.clearFilters();
            } else {
                provider.setFilter(quote -> quote.getMonth() > event.getValue());
            }
        });

        // grid setup
        Grid<Quote> grid = new Grid<>(Quote.class);
        grid.setDataProvider(provider);

        // header and footer
        HeaderRow header = grid.appendHeaderRow();
        header.getCell("month").setComponent(monthFilterCombo);
        FooterRow footer = grid.prependFooterRow();
        footer.getCell("month").setHtml("<b>Total:</b>");
        provider.addDataProviderListener(event -> footer.getCell("value").setHtml(calculateTotal(provider)));

        // add grid to UI
        setSizeFull();
        grid.setSizeFull();
        addComponent(grid);

        // trigger initial calculation
        provider.refreshAll();
    }

    // calculate the total of the filtered data
    private String calculateTotal(ListDataProvider<Quote> provider) {
        return "<b>" + String.valueOf(provider.fetch(new Query<>()).mapToInt(Quote::getValue).sum()) + "</b>";
    }

    // basic bean for easy binding
    public class Quote {
        private int month;
        private int value;

        public Quote(int month, int value) {
            this.month = month;
            this.value = value;
        }

        public int getMonth() {
            return month;
        }

        public void setMonth(int month) {
            this.month = month;
        }

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }
    }
}