#java #wicket #wicket-1.5 #wicket-6 #wicketstuff
#java #wicket #wicket-1.5 #wicket-6 #wicket stuff
Вопрос:
Я создал палитру в wicket, и я могу заполнить окно палитры слева. Но я хочу, чтобы параметры в палитре были динамическими, способными делать то же самое. Но проблема в том, что палитра не заполняется выбранными параметрами. У меня есть выпадающий список над палитрой, в зависимости от выбранного параметра я хочу заполнить палитру.
например (выпадающий список (роль) со значениями): 1.сценарий: выпадающий список -> палитра TL, Manager, SE, SSE -> изначально значений не будет, во время создания роли TL в окне rite палитры будет выбран навык. предположим, что роль TL создается с 4 навыками из 10 навыков. 2.сценарий: я хочу отредактировать роль TL, в этом случае, когда я когда-либо выбираю роль TL, палитра должна заполняться таким образом, чтобы выбранное должно быть справа, а доступное должно быть слева. я терплю неудачу во втором сценарии.
Вот код:
public class DropDownChoicePage extends WebPage {
private String selectedMake;
private final Map<String, List<String>> modelsMap = new HashMap<String, List<String>>();
private List<String> selected = new ArrayList<String>();
private String selectedEngine = "Google";
public DropDownChoicePage(final PageParameters parameters) {
add(new FeedbackPanel("feedback"));
modelsMap.put("AUDI", Arrays.asList(new String[] { "A4", "A6", "TT" }));
modelsMap.put("CADILLAC", Arrays.asList(new String[] { "CTS", "DTS", "ESCALADE", "SRX","DEVILLE" }));
modelsMap.put("FORD", Arrays.asList(new String[] { "CROWN", "ESCAPE", "EXPEDITION","EXPLORER", "F-150" }));
IModel<List<? extends String>> makeChoices = new AbstractReadOnlyModel<List<? extends String>>()
{
private static final long serialVersionUID = 1L;
@Override
public List<String> getObject()
{
Set<String> keys = modelsMap.keySet();
List<String> list = new ArrayList<String>(keys);
return list;
}
};
IModel<List<? extends String>> paletteChoices = new AbstractReadOnlyModel<List<? extends String>>(){
private static final long serialVersionUID = 1L;
@Override
public List<? extends String> getObject() {
List<String> models = modelsMap.get(selectedMake);
if (models == null)
{
models = Collections.emptyList();
}else if("FORD".equals(selectedMake)){
selected.add("CROWN");
selected.add("ESCAPE");
}
return models;
}
};
final DropDownChoice<String> makes = new DropDownChoice<String>("makes",new PropertyModel<String>(this, "selectedMake"), makeChoices);
IChoiceRenderer<String> renderer = new ChoiceRenderer<String>();
final Palette<String> palette = new Palette<String>("palette",
new ListModel<String>(selected),
paletteChoices,
renderer, 10, true);
palette.setOutputMarkupId(true);
makes.add(new AjaxFormComponentUpdatingBehavior("onchange")
{
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target)
{
selected = new ArrayList<String>();
target.addComponent(palette);
System.out.println("AjaxFormComponentUpdatingBehavior("onchange")");
System.out.println("Selected Make:" selectedMake);
}
});
Form<?> form = new Form<Void>("form") {
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit() {
info("Selected search engine : " selectedEngine);
selected = new ArrayList<String>();
}
};
add(form);
form.add(palette);
form.add(makes);
}
}
Не могли бы вы помочь мне во втором сценарии, т.е. Заполнить как левое, так и правое окна палитры доступными и выбранными значениями при изменении события выпадающего списка.
спасибо, Саран.
Ответ №1:
Я думаю, что в вашем коде есть две основные проблемы, которые помешают корректной работе второго сценария:
(1) В поведении Ajax onchange следующий код НЕ обновит ListModel выбранных вариантов:
selected = new ArrayList<String>();
Попробуйте это вместо:
selected.clear();
(2) Код, в котором вы добавляете уже выбранные варианты в список, должен иметь поведение Ajax, т.е.:
makes.add(new AjaxFormComponentUpdatingBehavior("onchange") {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
selected.clear();
List<String> alreadySelected = getAlreadySelectedChoicesBasedOnDropdownValue();
selected.addAll(alreadySelected);
//...
}
}
Где getAlreadySelectedChoicesBasedOnDropdownValue
будет возвращен новый список уже выбранных вариантов, например:
List<String> getAlreadySelectedChoicesBasedOnDropdownValue() {
if("FORD".equals(selectedMake)){
return Arrays.asList("CROWN", "ESCAPE");
}
}
Комментарии:
1. Я пробовал то же самое, но это не работает:( . я заметил, что здесь дело в том, что, когда я выбираю выбор отдельно от FORD, логика рендеринга paletteChoices выполняется только один раз, что является ожидаемым поведением, но когда я выбираю опцию FORD, paletteChoices выполняется трижды, я немного смущенпочему он ведет себя так.