1

在我的页面上,我有一个下拉列表,其值是根据枚举填充的,并且选择还设置了枚举的值。我现在需要在下拉列表中显示诸如“请选择一个值”之类的文本,而枚举中不存在该文本。

用户也可以不从下拉列表中选择任何值。

如果用户不选择值(用户这样做是合法的),如何在不修改枚举的情况下使用此附加文本填充 selectOne 并在托管 bean 中处理它。我尝试了各种组合,但对我没有任何效果。

这是我所做的工作,它是标准下拉列表,其中填充了不同的值枚举,只是一种标准方式。

这是这里的枚举

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;
    }   

}

托管 Bean

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>
4

2 回答 2

3

你可以像 Luggi 写的那样做,但是noSelectionOption在附加的<f:selectItem>. 作为建议 - 您不再需要List<SelectItem>fruits在支持 bean 上定义 selectItem List ,您可以这样做:

<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>

和不带水果的backing bean 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();
    }
}
于 2012-04-15T07:00:18.720 回答
1

添加一个f:selectItem并定义项目标签和项目值:

<h:selectOneMenu value="#{simplebean.selectedFruit}">
    <f:selectItem  itemLabel="Select a value" />
    <f:selectItems value="#{simplebean.fruits}" />
</h:selectOneMenu>
于 2012-04-15T06:21:52.837 回答