Java 如何在TwinColSelect中定义所选项目的最大限制
我想在我的vaadin ui中定义TwinColSelect中所选项目的最大数量。我怎样才能做到这一点。我想允许用户从可用的8个行星中只选择4个。我当前的代码是Java 如何在TwinColSelect中定义所选项目的最大限制,java,vaadin,Java,Vaadin,我想在我的vaadin ui中定义TwinColSelect中所选项目的最大数量。我怎样才能做到这一点。我想允许用户从可用的8个行星中只选择4个。我当前的代码是 TwinColSelect table = new TwinColSelect(); table.setImmediate(true); String planets[] = {"Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uran
TwinColSelect table = new TwinColSelect();
table.setImmediate(true);
String planets[] = {"Mercury", "Venus", "Earth", "Mars",
"Jupiter", "Saturn", "Uranus", "Neptune"};
for (int pl=0; pl<planets.length; pl++)
table.addItem(planets[pl]);
table.addListener(new Property.ValueChangeListener() {
public void valueChange(ValueChangeEvent event) {
/*String [] arr=(String [] )event.getProperty().getValue();
if(arr.length>=4){
return;
}*/
}
});
TwinColSelect表=新的TwinColSelect();
表.setImmediate(true);
弦行星[]={“水星”、“金星”、“地球”、“火星”,
“木星”、“土星”、“天王星”、“海王星”};
for(int pl=0;pl=4){
返回;
}*/
}
});
您可以通过更改select的值来实现类似的功能:
//Constant declared somewhere in the class
private static final int SELECTED_ITEMS_LIMIT = 4;
...
table.addListener(new Property.ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
Collection selectedItems = (Collection) event.getProperty().getValue();
if(selectedItems.size()>SELECTED_ITEMS_LIMIT) { //Set no more than SELECTED_ITEMS_LIMIT values
Set<String> noMoreThanLimitItems = new HashSet<String>(selectedItems.size());
int counter = 0;
for(Object item : selectedItems) {
if(counter>=SELECTED_ITEMS_LIMIT) {
break;
}
noMoreThanLimitItems.add((String) item);
counter++;
}
event.getProperty().setValue(noMoreThanLimitItems);
}
}
});
//类中某处声明的常量
私有静态最终选定的int_项_限制=4;
...
table.addListener(新属性.ValueChangeListener(){
@凌驾
public void valueChange(valuechangevent事件){
集合selectedItems=(集合)事件。getProperty().getValue();
如果(selectedItems.size()>选定的\u项\u限制){//设置的值不超过选定的\u项\u限制值
Set noMoreThanLimitItems=newhashset(selectedItems.size());
int计数器=0;
对于(对象项:selectedItems){
如果(计数器>=所选项目\u限制){
打破
}
noMoreThanLimitItems.add((字符串)项);
计数器++;
}
event.getProperty().setValue(noMoreThanLimitItems);
}
}
});
缺点:
- 代码是服务器端的。因此,在浏览器请求之间可能会选择四个以上的行星
- 调用
激发Property.setValue
。所以,每当用户尝试选择四个以上的行星时,处理代码将执行两次ValueChangeEvent
table.addValueChangeListener(new Property.ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
Collection selectedItems = (Collection) event.getProperty().getValue();
if(selectedItems.size()>SELECTED_ITEMS_LIMIT) { //Set no more than SELECTED_ITEMS_LIMIT values
Set<String> noMoreThanLimitItems = new HashSet<String>(selectedItems.size());
int counter = 0;
for(Object item : selectedItems) {
if(counter>=SELECTED_ITEMS_LIMIT) {
break;
}
noMoreThanLimitItems.add((String) item);
counter++;
}
event.getProperty().setValue(noMoreThanLimitItems);
//cast to twincol to get the needed functions
//markasdirty makes the object be repainted, so you wil not see more then 4 selected
((TwinColSelect)event.getProperty()).markasdirty();
}
}
});
table.addValueChangeListener(新属性.ValueChangeListener(){
@凌驾
public void valueChange(valuechangevent事件){
集合selectedItems=(集合)事件。getProperty().getValue();
如果(selectedItems.size()>选定的\u项\u限制){//设置的值不超过选定的\u项\u限制值
Set noMoreThanLimitItems=newhashset(selectedItems.size());
int计数器=0;
对于(对象项:selectedItems){
如果(计数器>=所选项目\u限制){
打破
}
noMoreThanLimitItems.add((字符串)项);
计数器++;
}
event.getProperty().setValue(noMoreThanLimitItems);
//转换为twincol以获得所需的函数
//markasdirty使对象重新绘制,因此您不会看到超过4个选定对象
((TwinColSelect)event.getProperty()).markasdirty();
}
}
});
谢谢你的朋友。它很好用。谢谢你的详细解释well@StevenBellens谢谢你的编辑!出于以下原因,我将其回滚。首先,我想让这个答案对瓦丁6号有帮助。其次,我没有正确地测试它。我建议你为Vaadin 7发布一个单独的答案。我很乐意为它投票并发布链接。再次感谢您的宝贵建议!