2011-07-06 15 views
5

¿Hay alguna manera obvia de agregar un separador a la lista de opciones en Wicket DropDownChoice? En mi caso estoy poblando la selección con dos tipos de objetos de dominio de mi fuente de datos. Supongo que podría ir y agregar manualmente algún tipo de objeto de dominio ficticio a la lista de opciones, pero se siente bastante feo.Separador en Wicket DropDownChoice

Ejemplo:

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

código actual (sin separador) se ve algo como:

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

Respuesta

2
+0

Solía esto como la solución, ver la descripción detallada a continuación en mi respuesta. – Janne

+1

Me encantaría ver un enlace actualizado si hay uno. De lo contrario, no estoy seguro de que esta respuesta todavía sea válida y probablemente deba eliminarse. – spaaarky21

+0

@ spaaarky21 tal vez [esto] (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 cosa es que PropertyModel se usa por una buena razón (los cambios de la interfaz de usuario se propagan de forma agradable y automáticamente hasta la capa de persistencia). Este enfoque (dando a DropDownChoice simplemente una lista de opciones) complicaría la forma en que se actualizan los objetos de dominio (y la base de datos). – Jonik

+0

Er, ¿qué? El ejemplo es sobre cómo agregar el separador (sobreescribiendo 'appendOptionHtml()' y anexando ''). Pasar una lista directamente fue lo más simple que pude hacer para hacer el ejemplo para compilar y ejecutar. Por supuesto, podría usar el 'PropertyModel' y las clases personalizadas ... – tetsuo

+0

Ah, lo siento, de alguna manera me olvidé de su punto (anulando appendOptionHtml()). De hecho, esto también funcionaría con PropertyModel. Tendría que averiguar cuál es el * último * objeto de dominio del * primer * tipo (o el primero del segundo tipo, que supongo que sería más fácil). Por lo tanto, +1 ya que esta es una solución viable que es, al menos, más rápida que cambiar a Seleccionar y seleccionar opciones de wicket-extensions. – Jonik

7

I terminó la solución de este utilizando los Select y SelectOptions componentes de wicket-extensions como se ha mencionado por 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); 

El HTML correspondiente es como la siguiente:

<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> 

Esto produce un poco diferente pero mejor resultado final como los optgroup etiquetas están en negrita y no se pueden seleccionar:

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

Esta solución asume que usted sabe que los grupos serán 'frutas' y 'verduras'. ¿Qué sucede si no conoce los grupos esperados? – joshua

+0

En ese caso, no podrá usar una SelectOption de esta manera, ya que bajo el capó es solo una RepeatingListView que necesita una identificación. Es posible que desee crear una lista de reproducción repetitiva directamente debajo de la selección que a su vez contiene una Opción Select con una ID fija. –