2011-07-06 13 views
5

C'è qualche modo ovvio per aggiungere un separatore all'elenco di opzioni in un DropDownChoice Wicket? Nel mio caso sto compilando la selezione con due tipi di oggetti di dominio dalla mia origine dati. Credo che potrei andare ad aggiungere manualmente una sorta di oggetto dominio fittizio all'elenco delle scelte, ma è piuttosto brutto.Separator in a Wicket DropDownChoice

Esempio:

+---------+-+ 
| Apple |▼| 
| Orange +-+ 
| ------- | 
| Carrot | 
| Cucumber| 
+---------+ 

codice attuale (senza alcun separatore) sembra qualcosa di simile:

EntityModel model = getModel(); 
List<? extends Produce> foods = foodService.getAllProduce(); 
// getAllProduce() returns first all fruits, then all vegetables 
add(new DropDownChoice<Produce>(
    "produceSelect", new PropertyModel<Produce>(model, "favProduce"), foods) 
); 

risposta

2
+0

ho usato questa come soluzione, vedi la descrizione dettagliata qui sotto nella mia risposta. – Janne

+1

Mi piacerebbe vedere un collegamento aggiornato se ce n'è uno. Altrimenti, non sono sicuro che questa risposta sia ancora valida e probabilmente dovrebbe essere cancellata. – spaaarky21

+0

@ spaaarky21 forse [questo] (http://www.wicket-library.com/wicket-examples/compref/wicket/bookmarkable/org.apache.wicket.examples.compref.SelectPage)? – aditsu

5
add(new DropDownChoice<String>("choice", Arrays.asList("Apple","Orange","Carrot","Cucumber")) { 
     @Override 
     protected void appendOptionHtml(AppendingStringBuffer buffer, String choice, int index, String selected) { 
      super.appendOptionHtml(buffer, choice, index, selected); 
      if ("Orange".equals(choice)) { 
       buffer.append("<optgroup label='----------'></optgroup>"); 
      } 
     } 
    }); 
+0

La proprietà è, PropertyModel viene utilizzato per una buona ragione (le modifiche all'interfaccia vengono propagate correttamente e automaticamente al livello di persistenza). Questo approccio (dando a DropDownChoice semplicemente un elenco di scelte) complicherebbe il modo in cui gli oggetti del dominio (e il database) vengono aggiornati. – Jonik

+0

Ehm, cosa? L'esempio riguarda come aggiungere il separatore (sovrascrivendo 'appendOptionHtml()' e aggiungendo ''). Passare direttamente una lista era solo la cosa più semplice che potessi fare per fare l'esempio per compilare ed eseguire. Ovviamente si potrebbe usare il 'PropertyModel' e le classi personalizzate ... – tetsuo

+0

Ah, scusa, in qualche modo ho mancato il punto (sovrascrivendo appendOptionHtml()). Questo funzionerebbe sicuramente anche con PropertyModel. Dovresti solo capire quale è l'ultimo oggetto dominio * del tipo * primo * (o il primo del secondo tipo, che immagino sia più semplice). Quindi, +1 come questa è una soluzione valida che è almeno più veloce di passare a Select e SelectOptions da wicket-extensions. – Jonik

7

ho finito per risolvere questo utilizzando i componenti Select e SelectOptions da wicket-extensions come detto da martin-g.

SelectOptions<Produce> fruitOptions = new SelectOptions<Produce>(
             "fruits", 
             fruitCollection, 
             new FruitRenderer()); 

SelectOptions<Produce> vegetableOptions = new SelectOptions<Produce>(
              "vegetables", 
              vegetableCollection, 
              new VegetableRenderer()); 

Select select = new Select("produceSelect", 
          new PropertyModel<Produce>(model, "favProduce")); 
select.add(fruitOptions); 
select.add(vegetableOptions); 

Il corrispondente codice HTML simile a questa:

<select wicket:id="produceSelect" id="produceSelect"> 
    <optgroup label="Fruits"> 
     <wicket:container wicket:id="fruits"> 
      <option wicket:id="option">Apple</option> 
     </wicket:container> 
    </optgroup> 
    <optgroup label="Vegetables"> 
     <wicket:container wicket:id="vegetables"> 
      <option wicket:id="option">Carrot</option> 
     </wicket:container> 
    </optgroup> 
</select> 

Questo produce un po 'diverso, ma risultato finale migliore, come i optgroup etichette sono in grassetto e non possono essere selezionati:

+----------------+-+ 
| **Fruits**  |▼| 
| Apple   +-+ 
| Orange   | 
| **Vegetables** | 
| Carrot   | 
| Cucumber  | 
+----------------+ 
+2

Questa soluzione presuppone che tu sappia che i gruppi saranno "frutta" e "verdure". Cosa succede se non conosci i gruppi previsti? – joshua

+0

In tal caso, non sarà possibile utilizzare un SelectOption in questo modo poiché sotto il cofano è solo un ripetendoListView che deve avere un ID. Potresti voler creare una lista di ripetizioni direttamente sotto la selezione che a sua volta contiene un SelectOption con un ID fisso? –