Как создать надежную палитру в Wicket

Я создал палитру в калитке, и я могу заполнить палитру в левом боковом окне. Но я хочу сделать параметры в палитре динамическими, способными делать то же самое. Но проблема в том, что палитра не заполняется выбранными параметрами. У меня есть раскрывающийся список над палитрой, в зависимости от выбранного параметра я хочу заполнить палитру.

например (выпадающий список(роль) со значениями): 1.scenario: выпадающий список --> палитра TL,Manager,SE,SSE --> изначально значений не будет, во время создания роль TL, в окне обрядов палитры будет выбран навык. предположим, что роль 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);
}
}

Не могли бы вы помочь мне во втором сценарии, то есть заполнить левое и правое окна палитры доступными и выбранными значениями при изменении события раскрывающегося списка.

спасибо, Саран.


person user1665207    schedule 24.06.2014    source источник


Ответы (1)


Я думаю, что в вашем коде есть две основные проблемы, которые мешают правильной работе второго сценария:

(1) В поведении onchange Ajax следующий код НЕ будет обновлять ListModel выбранных вариантов:

selected = new ArrayList<String>();

Попробуйте это вместо этого:

selected.clear();

(2) Код, в котором вы добавляете уже выбранные варианты в список, должен быть в Ajax Behavior, т.е.:

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");
    }
}
person David Tanzer    schedule 24.06.2014
comment
Я пробовал то же самое, но это не работает :(. Я заметил, что здесь, когда я выбираю выбор, кроме FORD, логика рендеринга палитрыChoices выполняется только один раз, что является ожидаемым поведением, но когда я выбираю вариант FORD выбор палитры выполняется сразу, я немного сбит с толку, почему он ведет себя так. - person user1665207; 26.06.2014