2016-06-22 17 views
1

ich einen Primefaces „SelectOneMenu“ mit Gegenständen haben bin versucht, die entweder ein „normales“ Etikett oder ein „bold“ Label haben. Ich habe 2 verschiedene Varianten ausprobiert, aber beide funktionieren nicht wie erwartet.<p: selectOneMenu> mit fett Etikett für einige Elemente

Variante 1:

<p:selectOneMenu id="menu" value="#{selected}"> 
    <f:selectItems value="#{mySelectItems}"/> 
</p:selectOneMenu> 

public List<SelectItem> getMySelectItems() { 
    List<SelectItem> list = new ArrayList<SelectItem>(); 
    for (...) { 
    SelectItem item = new SelectItem(value, label); 
    item.setEscape(false); 
    if (...) 
     item.setLabel("<b>" + item.getLabel() + "</b>"); 
    list.add(item); 
    } 
    return list; 
} 

So kann ich einige der Elemente im Menü mit einem mutigen Etikett und einige mit einem normalen Etikett haben. Das Problem: Das Feld, das die aktuelle Auswahl zeigt, ist die Darstellung des Textes als „< b> ... </b>“. Der Text scheint nicht maskiert zu sein, aber es scheint, dass er einfach nicht fett dargestellt werden kann, da er sich in einem HTML-Label befindet. Ich weiß nicht, wie ich von dem „< b>“ loswerden könnte und „</b>“ in diesem Label, though.

Variante 2:

<p:selectOneMenu id="menu" value="#{selected}" var="myClass"> 
    <f:selectItems value="#{myClasses}"/> 
    <p:column> 
    <h:outputText value="#{myClass.name}" styleClass="bold"/> 
    </p:column> 
</p:selectOneMenu> 

public List<MyClass> getMyClasses() { 
    List<MyClass> list = new ArrayList<MyClass>(); 
    ... 
    return list; 
} 

Bei dieser Variante I auch fett Etiketten für Einzelteile haben kann (alle von ihnen zur Zeit) im Menü. Das Problem ist: Der Text der aktuellen Auswahl zeigt nicht "myClass.getName()", sondern "myClass.toString(). Die Bezeichnungen im Menü sind korrekt. Gibt es eine Möglichkeit, dies zu beheben?

Wenn ich schreibe ...

<f:selectItems value="#{myClasses}" var="myVar" itemValue="#{myVar.value}" itemLabel="#{myVar.name}"/> 

statt, dann ist es nicht die Einzelteile mehr im Menü als fett angezeigt werden, aber es wird mit getName() anstelle von toString() auf dem Gebiet der aktuellen Auswahl.

Weiß jemand, wie ich meine Ideen so entwickeln kann, wie ich möchte, dass sie funktionieren oder vielleicht eine bessere Idee haben, wie man das löst?

Vielen Dank im Voraus!

Antwort

0

In Variante 2 müssen Sie Konverter für MyClass von javax.faces.convert.Converter Implementierung zur Verfügung zu stellen. Der Konverter benötigt nur die Auswahl (er erzeugt eine String-Repräsentation des Objekts (eindeutige ID der Instanz) und konvertiert sie zurück in das Objekt nach der Verarbeitung). Und für die korrekte Darstellung des ausgewählten Werts müssen Sie diese Attribute zu selectItems hinzufügen: <f:selectItems value="#{myClasses}" var="myVar" itemValue="#{myVar}" itemLabel="#{myVar.name}"/>. <h:outputText styleClass="bold"... wird nur für die Liste der selectItems bewirken. Um den Stil des ausgewählten Elements zu ändern, müssen Sie styleClass zu p:selectOneMenu hinzufügen. In Ihrem Fall:

<p:selectOneMenu id="menu" value="#{view.selection}" converter="#{view.myClassConverter}" 
    var="v" style="#{(view.selection.name eq 'bold-name') ? 'font-style: bold' : null}"> 
    <f:selectItems value="#{view.myClasses}" var="mc" 
     itemLabel="#{mc.name}" itemValue="#{mc}"/> 
    <p:column> 
     <h:outputText value="#{v.name}" style="#{(v.name eq 'bold-name') ? 'font-style: bold' : null}"/> 
    </p:column> 
    <p:ajax event="change" update="menu" process="@this"/> 

.