2014-02-03 2 views
4

У меня есть комбо на моей странице, которое я хочу заполнить некоторыми ключевыми словами из конфигурации. Я хочу использовать управляемый компонент для его выполнения.Population selectItems combobox (label, value) с использованием управляемого компонента

Предположим, что у меня есть bean, называемый Config, где есть поле категорий List. ..

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 моей комбо с двумя строками - меткой и значением?

EDIT:

Я попытался создать объект 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> 

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

+0

Используйте трубу ('|') разделитель ... например 'someList.add (« Я - метка | Я - значение »);' –

+0

Хорошо, труба работает, но это глупое решение. Что делать, если строка ключевого слова содержит символ канала? Разве нет другого решения с использованием простого объекта и какого-то конвертера? – JiKra

+0

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

ответ

8

Вместо возврата 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; 
} 
+1

+1 для SelectItemGroup. –

+0

Спасибо. Это именно то, что мне нужно. :-) – JiKra

+0

Марк, можете ли вы дать быстрый пример того, как это использовать? Может быть, потому, что в пятницу днем, и я уезжаю через час, но мне трудно понять, как это сделать. Спасибо. –

2

Вы можете использовать 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; 
    } 
} 
Смежные вопросы