在我们的一个应用程序中,我们使用惰性查询容器来浏览可能非常大的数据集。这非常有效。但是,当使用多选表时,可以选择任意数量的行。 在我们的例子中,这可能导致选择最多500.000行(Vaadin限制),然后崩溃VM。
有没有办法限制所选行的数量?
以下是显示问题的示例:
public class UIImpl extends UI {
private int SIZE = 500000;
@Override
protected void init(VaadinRequest request) {
// add a large table
LazyQueryContainer lqc = new LazyQueryContainer(
new QueryFactory() {
public Query constructQuery(QueryDefinition qd) {
return new Query() {
@Override
public int size() {
return SIZE;
}
@Override
public void saveItems(List<Item> addedItems, List<Item> modifiedItems, List<Item> removedItems) { }
@Override
public List<Item> loadItems(int startIndex, int count) {
List<Item> r = new ArrayList<>(count);
for (int i = startIndex; i<startIndex+count;i++) {
PropertysetItem item = new PropertysetItem();
item.addItemProperty("name", new ObjectProperty(i));
r.add(item);
}
return r;
}
@Override
public boolean deleteAllItems() {
return false;
}
@Override
public Item constructItem() {
return null;
}
};
}
},
null,
20,
false
);
lqc.addContainerProperty("name", Integer.class, null);
Table table = new Table();
table.setContainerDataSource(lqc);
table.setMultiSelect(true);
table.setSelectable(true);
table.setImmediate(true);
table.setVisibleColumns("name");
table.setSizeFull();
table.addValueChangeListener(new Property.ValueChangeListener() {
public void valueChange(Property.ValueChangeEvent event) {
System.err.println(event.getProperty().getValue());
}
});
setContent(table);
}
}
答案 0 :(得分:4)
如果您想限制用户可以选择的行数,您可以使用类似于以下代码的内容:
public class TableWithSelectionLimit extends Table {
private final int maxSelections= -1;
private String[] lastSelected;
public TableWithSelectionLimit(int maxSelections) {
this.maxSelections = maxSelections;
}
@Override
public void changeVariables(Object source, Map<String, Object> variables) {
String[] selected = (String[]) variables.get("selected");
if (selected != null && selected.length > maxSelections) {
if (lastSelected != null) {
variables.put("selected", lastSelected);
} else {
variables.remove("selected");
}
markAsDirty();
} else {
lastSelected = selected;
}
super.changeVariables(source, variables);
}
}
这当然是可以优化的,但它可以让你了解如何做到这一点。
<强>更新强>
用于处理使用&#34; Shift&#34; +单击一个必须在上述方法内另外处理/更新这些选择范围的选择。
可以使用variables.get("selectedRanges")
检索这些内容,这些内容会返回包含String[]
项的"8-10"
,而
使用此信息,应该可以根据需要更新这些值,并使用variables.put("selectedRanges", updatedRanges)
将它们放回变量中。
注意:如果值已更改,请不要忘记调用markAsDirty()
,否则更改不会传播到客户端。