Wicket DropDownChoice中的分隔符

Jan*_*nne 5 java wicket drop-down-menu

是否有一些明显的方法可以将分隔符添加到Wicket DropDownChoice中的选项列表中?在我的情况下,我用我的数据源中的两种类型的域对象填充选择.我想我可以去选择列表中手动添加某种虚拟域对象,但感觉非常难看.

例:

+---------+-+
| Apple   |?|
| Orange  +-+
| ------- |
| Carrot  |
| Cucumber|
+---------+
Run Code Online (Sandbox Code Playgroud)

当前代码(没有任何分隔符)看起来像:

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)
);
Run Code Online (Sandbox Code Playgroud)

Jan*_*nne 7

我最终使用了martin-g提到的wicket-extensions中SelectSelectOptions组件来解决这个问题.

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);
Run Code Online (Sandbox Code Playgroud)

相应的HTML看起来像这样:

<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>
Run Code Online (Sandbox Code Playgroud)

这会产生一些不同但更好的最终结果,因为optgroup标签是粗体并且无法选择:

+----------------+-+
| **Fruits**     |?|
| Apple          +-+  
| Orange         | 
| **Vegetables** |  
| Carrot         |
| Cucumber       |
+----------------+
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案假设您知道这些组将是"水果"和"蔬菜".如果你不知道预期的团体怎么办? (2认同)

tet*_*suo 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>");
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)