2013-09-04 1 views
1

Я хочу определить максимальное количество выбранных элементов в TwinColSelect в моем vaadin ui. Как я могу это достичь. Я хочу, чтобы позволить пользователю выбрать только 4 планеты из доступного текущего кода 8.My являетсяКак определить максимальный предел выбранных элементов в TwinColSelect

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

ответ

2

Вы можете реализовать что-то вроде этого, изменяя выберите значение:-х

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

Недостатки:

  • Код является серверным. Таким образом, более четырех планет могут отображаться как выбранные между запросами браузера.
  • Позвоните, чтобы Property.setValue пожаров ValueChangeEvent. Таким образом, обработка кода будет выполняться дважды каждый раз, когда пользователь пытается выбрать более четырех планет.
+0

спасибо другу. Он работает нормально. Спасибо за подробное объяснение, а также –

+0

@StevenBellens Спасибо за ваше редактирование! Я вернул его по следующим причинам. * Во-первых, * Я хочу, чтобы этот ответ был полезен для Ваадина 6. * Во-вторых, я не проверял его правильно. Я предлагаю вам отправить отдельный ответ для Vaadin 7. Я был бы рад поддержать его и опубликовать ссылку на него. Еще раз спасибо за ваши ценные предложения! –

1

Благодаря языку по умолчанию заранее. Вчера я сделал несколько eddits для вышеуказанного кода, которые удалили первый недостаток, упомянутый в другом ответе, а также изменили добавление, которое стало уменьшаться.

Ответ на Vaadin 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(); 
    } 
} 
}); 
Смежные вопросы