Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.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 如何在TwinColSelect中定义所选项目的最大限制_Java_Vaadin - Fatal编程技术网

Java 如何在TwinColSelect中定义所选项目的最大限制

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

我想在我的vaadin ui中定义TwinColSelect中所选项目的最大数量。我怎样才能做到这一点。我想允许用户从可用的8个行星中只选择4个。我当前的代码是

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
    。所以,每当用户尝试选择四个以上的行星时,处理代码将执行两次

由于提前设置了默认语言环境。昨天,我对上面的代码做了一些修改,消除了另一个答案中提到的第一个缺点,并更改了add,该add已被删除

瓦丁7号的答案如下

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发布一个单独的答案。我很乐意为它投票并发布链接。再次感谢您的宝贵建议!