Заполнение selectItems комбинированного списка (метка, значение) с использованием управляемого компонента

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

Допустим, у меня есть бин с именем Config, в котором есть поле списка категорий...

public class Configuration implements Serializable {
    private static final long serialVersionUID = 1L;
    private List<String> categories;

    public List<String> getCategories() {
        if (categories == null)
            categories = getCats();

        return categories;
    }

    //... etc.
}

Когда я использую это поле для комбо, оно работает хорошо...

<xp:comboBox>
    <xp:selectItems>
        <xp:this.value><![CDATA[#{config.categories}]]></xp:this.value>
    </xp:selectItems>
</xp:comboBox>

Но это всего лишь список меток. Мне тоже нужны ценности. Как мне заполнить selectItems моей комбо двумя строками - меткой и значением?

РЕДАКТИРОВАТЬ:

Я попытался создать объект Combo с полями меток и значений и использовать повтор внутри моего comboBox.

<xp:comboBox>
    <xp:repeat id="repeat1" value="#{config.combo}" var="c" rows="30">
        <xp:selectItem itemLabel="#{c.label}" itemValue="#{c.value}" />
    </xp:repeat>
</xp:comboBox>

До сих пор не работает...:-(

2 ответа

Решение

Вместо возврата List<String> ваша функция должна вернуть List<javax.faces.model.SelectItem>, Вот пример:

public static List<SelectItem> getComboboxOptions() {

    List<SelectItem> options = new ArrayList<SelectItem>();

    SelectItem option = new SelectItem();
    option.setLabel("Here's a label");
    option.setValue("Here's a value");

    options.add(option);

    return options;
}

Преимущество использования этого метода (помимо того, что нет необходимости использовать эти непонятные вещи:-) в том, что вы также можете SelectItemGroup класс для группировки вариантов:

public static List<SelectItem> getGroupedComboboxOptions() {

    List<SelectItem> groupedOptions = new ArrayList<SelectItem>();

    SelectItemGroup group = new SelectItemGroup("A group of options");

    SelectItem[] options = new SelectItem[2];

    options[0] = new SelectItem("here's a value", "here's a label");
    options[1] = new SelectItem("here's a value", "here's a label");

    group.setSelectItems(options);

    groupedOptions.add(group);

    return groupedOptions;
}

Ты можешь использовать SelectItems, (см. http://docs.oracle.com/javaee/6/api/javax/faces/model/SelectItem.html).

Вы можете указать как значение и метку, так и только значение.

import javax.faces.model.SelectItem;

public List<SelectItem> getCategories() {
    try {
        ArrayList<SelectItem> ret = new ArrayList<SelectItem>();
        ret.add(new SelectItem("my value", "my label"));
        return ret;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}
Другие вопросы по тегам