BeanItemContainer 唯一 属性 值

BeanItemContainer unique property values

我正在为我的网格使用 BeanItemContainer。我想获得其中一个属性的唯一列表。例如,假设我的豆子如下:

class Fun {
     String game;
     String rules;
     String winner;
}

这将在我的网格中显示为 3 列。我想获取 game 属性 的所有唯一值的列表。我该怎么做?我在多个不同的 bean 类 中有相同的 属性 id,所以直接从 BeanItemContainer 获取值会很好。我试图避免在将数据加载到网格之前构建这个唯一列表,因为这样做需要我根据具体情况进行处理。

我的最终目标是根据这些唯一值在过滤器中创建下拉菜单。

没有任何助手可以直接按照您的要求进行操作。相反,您必须通过遍历所有项目并将 属性 值收集到 Set 来“手动”执行此操作,然后最后包含所有唯一值。

或者,如果数据来自数据库,那么您可以使用例如从数据库中检索唯一值SQL.

中的 DISTINCT 关键字

如果有人好奇,这就是我应用 Leif 的建议的方式。当他们进入下拉列表时,我循环浏览我关心的列的 属性 id 的所有项目 id,然后根据该 属性 id 填充值。由于同一个网格可以加载新数据,我也必须“清除”这个项目 ID 列表。

        filterField.addFocusListener(focus->{
            if(!(filterField.getItemIds() instanceof Collection) ||
                    filterField.getItemIds().isEmpty())
            {
                BeanItemContainer<T> container = getGridContainer();

                if( container instanceof BeanItemContainer && getFilterPropertyId() instanceof Object )
                {
                    List<T> itemIds = container.getItemIds();
                    Set<String> distinctValues = new HashSet<String>();
                    
                    for(T itemId : itemIds)
                    {
                        Property<?> prop = container.getContainerProperty(itemId, getFilterPropertyId());
                        String value = null;

                        if( prop.getValue() instanceof String )
                        {
                            value = (String) prop.getValue();
                        }
                        
                        if(value instanceof String && !value.trim().isEmpty())
                            distinctValues.add(value);
                    }
                    
                    filterField.addItems(distinctValues);
                }
            }
        });

要点:filterField 变量正在使用 Vaadin 7 的 ComboBoxMultiselect 附加组件。希望当我终于有时间转换到 Vaadin 14+ 时,我可以在那里做类似的事情.