开发者

AbstractReadonlyModel in wicket Framework

开发者 https://www.devze.com 2023-03-05 12:11 出处:网络
package org.apache.wicket.examples.ajax.builtin; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections;
package org.apache.wicket.examples.ajax.builtin;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
imp开发者_如何学编程ort java.util.Map;
import java.util.Set;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;

/**
 * Linked select boxes example
 * 
 * @author Igor Vaynberg (ivaynberg)
 */
public class ChoicePage extends BasePage
{
private String selectedMake;

private final Map<String, List<String>> modelsMap = new HashMap<String, List<String>>(); // map:company->model

/**
 * @return Currently selected make
 */
public String getSelectedMake()
{
    return selectedMake;
}

/**
 * @param selectedMake
 *            The make that is currently selected
 */
public void setSelectedMake(String selectedMake)
{
    this.selectedMake = selectedMake;
}

/**
 * Constructor.
 */
public ChoicePage()
{
    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>>()
    {
        @Override
        public List<String> getObject()
        {
            Set<String> keys = modelsMap.keySet();
            List<String> list = new ArrayList<String>(keys);
            return list;
        }

    };

    IModel<List<? extends String>> modelChoices = new AbstractReadOnlyModel<List<? extends String>>()
    {
        @Override
        public List<String> getObject()
        {
            List<String> models = modelsMap.get(selectedMake);
            if (models == null)
            {
                models = Collections.emptyList();
            }
            return models;
        }

    };

    Form<?> form = new Form("form");
    add(form);

    final DropDownChoice<String> makes = new DropDownChoice<String>("makes",
        new PropertyModel<String>(this, "selectedMake"), makeChoices);

    final DropDownChoice<String> models = new DropDownChoice<String>("models",
        new Model<String>(), modelChoices);
    models.setOutputMarkupId(true);

    form.add(makes);
    form.add(models);

    makes.add(new AjaxFormComponentUpdatingBehavior("onchange")
    {
        @Override
        protected void onUpdate(AjaxRequestTarget target)
        {
            target.addComponent(models);
        }
    });
}

}

What is the use two AbstractReadonlyModel here?i couldnt understand the logic of this program.can anybody plz help to understand this one


These AbstractReadOnlyModels are used, because their content must not be changed.

The first model provides a list of car brands, which may be selected via a dropdownlist. The second model returns dependent on the selected brand a list of car types, which is selectable via another dropdownlist.

Here it wouldn't make sense to alter the list of brands or car types.


You are referring to this wicket example.

Each DropDownChoice needs its own model with the data to show its choices.

The first AbstractReadOnlyModel simply takes the keys of the Map modelsMap as its data. The second one uses an Array-List based on the choice of the first dropdown-selection.

0

精彩评论

暂无评论...
验证码 换一张
取 消