Как я могу отобразить значение в selectOne, отсутствующее в перечислении?

На моей странице у меня есть раскрывающийся список, значения которого заполняются на основе перечисления, и выбор также устанавливает значение перечисления. Теперь у меня есть требование отображать текст типа «Пожалуйста, выберите значение» в раскрывающемся списке, которого нет в перечислении.

Пользователь также может не выбирать значение из раскрывающегося списка.

Как можно заполнить selectOne этим дополнительным текстом без изменения перечисления и обработать его в управляемом компоненте, если пользователь не выбирает значение (что разрешено для пользователя). Я пробовал разные комбинации, но у меня ничего не получалось.

Вот то, что у меня есть, это стандартный выпадающий список, заполненный перечислением разных значений стандартным способом.

Это перечисление здесь

public enum Fruit {
    APPLE("Apple"), ORANGE("Orange");

    private String label;

    Fruit(String label) {
        this.label = label;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }   

}

Управляемый компонент

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.model.SelectItem;

@ManagedBean
public class Simplebean {

    private Fruit selectedFruit;// How would this work if the value is not valid enum .
    private List<SelectItem>fruits = new ArrayList<SelectItem>();

    @PostConstruct
    public void init(){
        for (Fruit fruit : Fruit.values()){
            fruits.add(new SelectItem(fruit,fruit.getLabel()));// How to add a value not part of enum.
        }
    }

    public List<SelectItem> getFruits() {
        return fruits;
    }

    public void setFruits(List<SelectItem> fruits) {
        this.fruits = fruits;
    }

    public Fruit getSelectedFruit() {
        return selectedFruit;
    }

    public void setSelectedFruit(Fruit selectedFruit) {
        this.selectedFruit = selectedFruit;
    }

}

В XHTML

<h:selectOneMenu value="#{simplebean.selectedFruit}">
    <f:selectItems value="#{simplebean.fruits}" />
</h:selectOneMenu>

person Java Ka Baby    schedule 15.04.2012    source источник
comment
попробуйте жестко закодировать значения при добавлении списка вместо получения его из ENUM.   -  person UVM    schedule 15.04.2012


Ответы (2)


Вы можете сделать это, как написал Лугги, но добавить noSelectionOption к дополнительному <f:selectItem>. И как предложение - вам больше не нужно определять список selectItem List<SelectItem>fruits на вспомогательном компоненте, вы можете сделать это следующим образом:

<h:selectOneMenu value="#{simplebean.selectedFruit}">
    <f:selectItem itemLabel="Select a value" noSelectionOption="true"/>
    <f:selectItems value="#{simplebean.fruits}" var="fruit" itemLabel="#{fruit.label}" itemValue="#{fruit}"/>
</h:selectOneMenu>

И фоновая фасоль без фруктов selectItems:

@ManagedBean
public class Simplebean {

    private Fruit selectedFruit;

    public Fruit getSelectedFruit() {
        return selectedFruit;
    }

    public void setSelectedFruit(Fruit selectedFruit) {
        this.selectedFruit = selectedFruit;
    }

    public Fruit[] getFruits() {
        return Fruit.values();
    }
}
person fischermatte    schedule 15.04.2012

Добавьте f:selectItem и определите метку элемента и значение элемента:

<h:selectOneMenu value="#{simplebean.selectedFruit}">
    <f:selectItem  itemLabel="Select a value" />
    <f:selectItems value="#{simplebean.fruits}" />
</h:selectOneMenu>
person Luiggi Mendoza    schedule 15.04.2012