Как заполнить правую часть раскрывающегося списка richfaces?
Вопрос
Я использую Richfaces' список выбора и я хочу заполнить правую боковую панель списком SelectItems из моего резервного компонента.
Заполнение левой части не является проблемой из вспомогательного компонента, однако правая сторона является проблематичной.
Это то, что у меня сейчас есть
<h:outputText value="Roles" />
<rich:pickList showButtonsLabel="false">
<f:selectItems value="#{Bean.allRoles}" />
</rich:pickList>
Редактировать:
Итак, у меня есть роли "a", "b", "c" и "d".
У пользователя есть роли "a" и "d", поэтому "a" и "d" должны быть на правой панели, а "b" и "c" - на левой.
Редактировать:
Дальнейшее объяснение.
У меня есть три списка для пользователя.
- Все возможные роли (от a до d)
- Все роли, частью которых является пользователь (a и d)
- Все роли, частью которых пользователь НЕ является (b и c)
Все списки имеют один и тот же тип данных ArrayList<SelectItem>
.
Мне нужна возможность перемещать отдельные роли между списком № 1 и списком № 2, а затем сохранять новый набор ролей.Я подумал, что список выбора будет лучшим объектом richfaces для этой работы.
Решение
Вам нужен этот код:
<h:outputText value="Roles" />
<rich:pickList showButtonsLabel="false" value="#{bean.chosenRoles}">
<f:selectItems value="#{Bean.allRoles}" />
</rich:pickList>
и в своей фасоли ты хочешь:
private String[] chosenRoles;
+ getter/setter
Когда вы хотите создать роли по умолчанию, вы просто добавляете роли в массив chosenRoles (например, в bean конструкторе).Таким образом, chosenRoles всегда будет содержать элементы в правой части списка выбора, в то время как элементы в левой части не находятся в массиве.
Надеюсь, это поможет!
Другие советы
Кажется, я нашел решение.
<rich:pickList value="#{aBean.rightSideValues}">
<f:selectItems value="#{aBean.leftSideValues}"/>
</rich:pickList>
"#{aBean.rightSideValues}"
должен указывать на список или массив объектов.Этими значениями будет заполнена правая часть списка выбора.#{aBean.leftSideValues}
должен указывать на список объекта SelectItem .
ОДНО ЗАМЕЧАНИЕ - объект SelectItem ДОЛЖЕН БЫТЬ сконструирован с объектами из "#{aBean.rightSideValues}"
.
Пример.
class ABean{
...
List<SomeObject> getRightSideValues(){
...
}
List<SelectItem> getLeftSideValues(){
List<SomeObjects> someObjects = getAllAvailableObjects();
List<SelectItem> sItems = new ArrayList<SelectItem>();
for(SomeObject sObj : someObjects){
SelectItem sItem = new SelectItem(sObj, sObj.toString());
sItems.add(sItem);
}
return sItems;
}
Обратите внимание, что SelectItem принимает первый аргумент, и этот аргумент является ссылкой на SomeObject.Во внутренних компонентах rich faces будет сравнивать объекты из "#{aBean.rightSideValues}"
с объектами из
#{aBean.leftSideValues}
с помощью этого метода
SomeObject.equals()
Если вам нужны значения, отличные от текста, вам нужно создать конвертер.
Видишь http://programmingnutsandbolts.blogspot.com/2009/08/richfaces-picklist-converters.html
Как и в RF 4.3.3 и, вероятно, ранее, вам также необходимо переопределить метод хэша вашего класса модели (entity bean).Таким образом, только переопределения метода equals для вашего конвертера недостаточно.Следующее сработало для меня и моего компонента сущности PubThread.
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (!(obj instanceof PubThread))
return false;
PubThread objectToCheck = (PubThread) obj;
boolean isShallowCopy = (this.id.equals(objectToCheck.id));
return isShallowCopy;
}
@Override
public int hashCode() {
return (this.id.hashCode());
}
Установите значение списка выбора в массив значения SelectItem.
Независимо от того, с чего вы начнете с правой стороны, это, по сути, будет просто значением по умолчанию в списке выбора:
<rich:pickList value="#{aBean.rightSideValues}">
<f:selectItems value="#{aBean.leftSideValues}"/>
</rich:pickList>