2016-06-22 3 views
1

Я пытаюсь получить «PrimeOneMenu» с элементами, которые могут иметь «нормальную» метку или «жирный» ярлык. Я попробовал 2 разных варианта, но оба они работают не так, как ожидалось.<p: selectOneMenu> с жирным шрифтом для некоторых элементов

Вариант 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; 
} 

Таким образом, я могу иметь некоторые из пунктов меню с жирной этикеткой и некоторые из них с нормальной этикеткой. Проблема: поле, показывающее текущий выбор, отображает текст как «< b> ... </b>». Текст, похоже, не экранирован, но кажется, что он просто не может быть выделен полужирным шрифтом, потому что он находится внутри метки HTML. Я не знаю, как я мог бы избавиться от «< b>» и «</b>» на этом ярлыке.

Вариант 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; 
} 

С помощью этого варианта можно также иметь смелые ярлыки для элементов (в настоящее время их все) в меню. Проблема заключается в следующем: текст, показывающий текущий выбор, не отображает «myClass.getName()», но вместо этого «myClass.toString(). Ярлыки в меню верны. Есть ли способ исправить это?

Если я пишу ...

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

вместо этого, то он не отображает пункты меню, как полужирный больше, но он использует GetName() вместо ToString() в области текущего выбора.

Кто-нибудь знает, как заставить мои идеи работать так, как я хочу, чтобы они работали, или, может быть, есть лучшая идея о том, как это решить?

Заранее спасибо!

ответ

0

В варианте 2 вам необходимо предоставить преобразователь для MyClass путем внедрения javax.faces.convert.Converter. Конвертер нуждается только в выборе (он генерирует строковое представление объекта (уникальный идентификатор экземпляра) и преобразует его обратно в объект после обработки). И для правильного представления выбранного значения вам нужно добавить эти атрибуты в selectItems: <f:selectItems value="#{myClasses}" var="myVar" itemValue="#{myVar}" itemLabel="#{myVar.name}"/>. <h:outputText styleClass="bold"... будет действовать только для списка элементов selectItems. Чтобы изменить стиль выбранного элемента, вам нужно добавить styleClass в p:selectOneMenu. В вашем случае:

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

.

Смежные вопросы