У меня была в основном та же проблема. После нескольких дней поиска короткого решения, я считаю, что для максимальной гибкости лучше всего использовать повторители, контейнеры и AttributeModifier , что-то вроде:
<select wicket:id="select">
<wicket:container wicket:id="repeatingView">
<optgroup wicket:id="optGroup">
<wicket:container wicket:id="selectOptions">
<option wicket:id="option"></option>
</wicket:container>
</optgroup>
</wicket:container>
</select>
В Java-коде «select» - это Select; «repeatatingView» является RepeatingView. Внутри RepeatingView есть вложенный WebMarkupContainer с именем .newChildId (). Внутри находится еще один WebMarkupContainer, который представляет «optGroup». Внутри этого второго WMC находятся AttributeModifier, который добавляет динамическую метку в optgroup, и SelectOptions, который обрабатывает «selectOptions» и «option». Что-то вроде:
Select select = new Select("select");
add(select);
RepeatingView rv = new RepeatingView("repeatingView");
select.add(rv);
for(String groupName : groupNames){
WebMarkupContainer overOptGroup = new WebMarkupContainer(rv.newChildId());
rv.add(overGroup);
WebMarkupContainer optGroup = new WebMarkupContainer("optGroup");
overOptGroup.add(optGroup);
optGroup.add(
new AttributeModifier("label",true,new Model<String>(groupName))
);
optGroup.add(
new SelectOptions<MyBean>(
"selectOptions",listOfBeanOptionsForThisGroup,new MyBeanRenderer()
)
);
}
(предполагается, что строки передаются напрямую как имена групп и что параметры относятся к компонентам типа MyBean, перечисленным в переменной listOfBeanOptionsForThisGroup)
Я полагаю, что не должно быть сложным преобразовать это решение во что-то, что использует гораздо меньше вложений, если у кого-то есть предложения, я отредактирую их в ответе и внесу в кредит. Использование ListView вместо RepeatingView также должно уменьшить размер кода.