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:
Converter:
Util:
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">
<h
anelGrid columns="1" cellpadding="3">
<h
utputLabel value="Abo-Name: " />
<h:inputText id="if_firstname" value="#{aboBean.name}" />
<h
utputLabel 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>
<h
utputLabel 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>
</h
anelGrid>
</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.
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:
Java:
@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:
Java:
@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:
Java:
@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
<h:body>
<h:form id="frm_add">
<h
<h
<h:inputText id="if_firstname" value="#{aboBean.name}" />
<h
<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>
<h
<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>
</h
</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.
Zuletzt bearbeitet: