1

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;
        }*/
    }
});
4

2 に答える 2

2

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);
        }  
    }
});

欠点:

  • コードはサーバー側です。そのため、ブラウザのリクエスト間で選択された惑星が 4 つ以上表示される場合があります。
  • Property.setValue火を呼ぶValueChangeEvent。そのため、ユーザーが 5 つ以上の惑星を選択しようとするたびに、処理コードが 2 回実行されます。
于 2013-09-04T11:34:52.117 に答える