2012-04-15 5 views
1

Auf meiner Seite habe ich eine Dropdown-Liste, deren Werte basierend auf einer Aufzählung gefüllt werden und die Auswahl legt auch den Wert der Aufzählung fest. Ich habe jetzt die Anforderung, Text wie "Bitte wählen Sie einen Wert" in der Dropdown-Liste anzuzeigen, und das ist nicht in enum vorhanden.Wie kann ich einen Wert in selectOne nicht in der enum anzeigen?

Es ist auch möglich, dass der Benutzer keinen Wert aus der Dropdown-Liste auswählt.

Wie kann man selectOne mit diesem zusätzlichen Text auffüllen, ohne Enum zu ändern und es in der verwalteten Bean zu handhaben, wenn der Benutzer keinen Wert auswählt (was für den Benutzer erlaubt ist). Ich habe verschiedene Kombinationen ausprobiert, aber nichts hat für mich funktioniert.

Hier ist, was ich arbeite, die Standard-Dropdown-Liste mit verschiedenen Werten enum nur einen Standard Weg gefüllt ist.

Dies ist Enum hier

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

} 

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

} 

In XHTML

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

versuchen Sie, die Werte beim Hinzufügen der Liste hart Code, anstatt es von ENUM zu bekommen. – UVM

Antwort

3

Sie können es tun, wie Luggi schrieb, aber fügen Sie die noSelectionOption zu den zusätzlichen <f:selectItem> hinzu. Und als Vorschlag - Sie brauchen nicht auf die selectItem Liste definieren List<SelectItem>fruits mehr auf dem Träger Bohne, können Sie es auf diese Weise tun:

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

und den Backing Bean ohne Früchte 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(); 
    } 
} 
1

ein f:selectItem hinzufügen und das Element Etikett und Elementwert definieren:

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