# PrimeFaces - selectOneMenu



## fsicher (6. Okt 2012)

Hallo allerseits

Habe mit selectOneMenu Probleme und werde daraus nicht wirklich schlau ...

Ich möchte Abos verwalten, wobei (um es einfach zu halten) ein Abo die Bezeichnung (Name), das Start- und Endjahr (Gültigkeit) hat. Das Start- und End-Jahr müssen mit Hilfe eines 'selectOneMenu' ausgewählt werden können (der Range (delta) wird an sich dynamisch eingelesen etc.). 

Nun benimmt sich das ganze etwas merkwürdig ... 

Abo:

```
@ManagedBean(name = "aboBean")
@SessionScoped
public class Abo implements Serializable {

	private static final long serialVersionUID = 8405305032244504596L;

	private int id;
	private String name;
	private int jahrVon;
	private int jahrBis;

	private Jahr selectedYearVon;
	private Jahr selectedYearBis;



	private List<Jahr> jahrListe = HelperService.getInstance().getAllJahr();

	public Abo() {
	}

	public Abo(int id, String name, int jahrVon, int jahrBis) {
		this.id = id;
		this.name = name;
		this.jahrVon = jahrVon;
		this.jahrBis = jahrBis;
	}

	// set und get ...

}
```

Converter:

```
@FacesConverter(value = "jahrConverter")
public class JahrConverter implements Converter {

	@Override
	public Object getAsObject(FacesContext context, UIComponent component,
			String value) {

		/* value - jahr als String */
		Util s = Util.getInstance();

		List<Jahr> l = s.searchJahr(value);

		if (l.isEmpty()) {
			return null;
		} else {
			return l.get(0);
		}
	}

	@Override
	public String getAsString(FacesContext context, UIComponent component,
			Object value) {
		if (value instanceof Jahr) {
			return ((Jahr) value).toString();
		}

		return "";
	}
}
```

Util:

```
@ManagedBean
@SessionScoped
public class Util implements Serializable {

	private static final long serialVersionUID = -1776603875281314213L;

	private static Util INSTANCE = new Util();

	private static final Map<Integer, Jahr> TABLE_JAHR = new HashMap<Integer, Jahr>();

	static {
		initJahr();
	}

	private static void initPosition() {
		for (int i = 1; i <= 12; i++) {
			TABLE_POSITION.put(i, new Position(i));
		}
	}

	private static void initJahr() {
		int delta = 10;

		GregorianCalendar gc = new GregorianCalendar();
		int jahr = gc.get(Calendar.YEAR);

		int id = 0;

		int min = jahr - delta;
		int max = jahr + delta;

		for (int i = min; i <= max; i++) {
			TABLE_JAHR.put(id, new Jahr(id, i));
			id++;
		}
	}

	private Util() {

	}

	public static Util getInstance() {
		return INSTANCE;
	}

	public List<Jahr> getAllJahr() {
		ArrayList<Jahr> l = new ArrayList<Jahr>();
		Collection<Jahr> c = TABLE_JAHR.values();
		l.addAll(c);

		return l;
	}

	public List<Jahr> searchJahr(String valueAsString) {

		String searchCriteria = (valueAsString == null) ? "" : valueAsString
				.toLowerCase().trim();

		Collection<Jahr> c = TABLE_JAHR.values();

		Collection<Jahr> results = new ArrayList<Jahr>();

		for (Jahr temp : c) {
			if (temp.getValueAsString() != null
					&& temp.getValueAsString().toLowerCase().trim()
							.startsWith(searchCriteria)) {
				results.add(temp);
			}
		}

		return new ArrayList<Jahr>(results);
	}

	public Jahr getJahr(Integer jahrId) {
		return TABLE_JAHR.get(jahrId);
	}
}
```

und die xhtml-Datei:
[XML]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns="http://primefaces.org/ui">

<h:body>
	<h:form id="frm_add">
		<hanelGrid columns="1" cellpadding="3">
			<hutputLabel value="Abo-Name: " />
			<h:inputText id="if_firstname" value="#{aboBean.name}" />

			<hutputLabel value="Jahr Von: " />
			<p:selectOneMenu id="id_von" value="#{aboBean.selectedYearVon}"
				converter="jahrConverter" var="converter_von"
				panelStyle="width:120px" effect="fade" style="width:120px;"
				height="80">

				<f:selectItem itemLabel="Select One" itemValue=""
					noSelectionOption="true" />

				<f:selectItems value="#{aboBean.jahrListe}" var="year"
					itemLabel="#{year.valueAsString}" itemValue="#{year}" />
			</p:selectOneMenu>

			<hutputLabel value="Jahr Bis: " />
			<p:selectOneMenu id="id_age" value="#{aboBean.selectedYearBis}"
				converter="jahrConverter" var="converter_bis"
				panelStyle="width:120px" effect="fade" style="width:120px;"
				height="80">

				<f:selectItem itemLabel="Select One" itemValue=""
					noSelectionOption="true" />

				<f:selectItems value="#{aboBean.jahrListe}" var="year"
					itemLabel="#{year.valueAsString}" itemValue="#{year}" />
			</p:selectOneMenu>

		</hanelGrid>
	</h:form>
</h:body>
</html>
[/XML]

Wenn ich die Seite anzeige, sieht es wie hier aus:

pf_selOneMenu1 | Flickr - Photo Sharing!

Wenn ich auch mit 
[XML]
<p:column> #{converter_von.valueAsString}</p:column> 
[/XML]
komme, dann werden alle Jahre noch einmal unterhalb des 'selectOneMenu' angezeigt. 

Sieht jeman, was hier falsch ist? Jahre werden zwar im selectOneMenu' korrekt angezeigt, aber wieso wird 'Select One' noch einmal unterhalb angezeigt? Ich könnte auch den Teil 

[XML]
<f:selectItem itemLabel="Select One" itemValue=""
					noSelectionOption="true" />
[/XML]

zwar verzichten, aber, das sollte funktionieren: ich sollte ein Suchfeld sehen, wo ich schnell das Jahr filtern kann. 
Benutze primefaces 3.4.1

Vielen Dank.


----------



## fsicher (7. Okt 2012)

Nun, habe ich es (durch Zufall) herausgefunden, als ich _styles _in die Seite zum Testen eingefügt habe ...

Offenbar muss die Seite (aus welchem Grund auch immer ...) den Teil 

[XML]
<h:head>

</h:head>
[/XML]

haben. Nachdem dieser Teil eingefügt wurde, verhalten sich die Komponenten wieder "ordentlich".


----------



## jwiesmann (9. Okt 2012)

fsicher hat gesagt.:


> ...
> Offenbar muss die Seite (aus welchem Grund auch immer ...) den Teil
> ..


Die Erklärung ist eigentlich recht einfach:
jsf - What's the difference between <h:head> and <head> in Java Facelets? - Stack Overflow
Bedeutet in kurzform: 
	
	
	
	





```
h:head
```
 kann vom java-code manipuliert werden und primefaces wird dort ihre stylesheets hinterlegen


----------

