Как заполнить правую часть списка выбора richfaces? - PullRequest
8 голосов
/ 08 мая 2009

Я использую список выбора Richfaces и хочу заполнить правую панель списком элементов SelectItems из моего компонента поддержки.

Заполнение левой стороны не является проблемой для компонента поддержки, однако правая сторона является проблематичной.

Это то, что у меня сейчас есть

<h:outputText value="Roles" />
<rich:pickList showButtonsLabel="false">
    <f:selectItems value="#{Bean.allRoles}" />
</rich:pickList>

EDIT:

Итак, у меня есть роли «a», «b», «c» и «d».

Пользователь имеет роли «a» и «d», поэтому «a» и «d» должны быть на правой боковой панели, а «b» и «c» - на левой.

EDIT:

Дальнейшее объяснение.

У меня есть три списка для пользователя.

  1. Все возможные роли (через d)
  2. Все роли, в которых участвует пользователь (a и d)
  3. Все роли, в которых пользователь НЕ участвует (b и c)

Все списки имеют тип данных ArrayList<SelectItem>.

Мне нужна возможность перемещать отдельные роли между списком № 1 и списком № 2, а затем сохранять новый набор ролей. Я думал, что список выбора будет лучшим объектом richfaces для работы.

Ответы [ 5 ]

6 голосов
/ 30 июня 2010

Кажется, я нашел решение.

<rich:pickList value="#{aBean.rightSideValues}"> 
        <f:selectItems value="#{aBean.leftSideValues}"/>
</rich:pickList>
  • "#{aBean.rightSideValues}" должен указывать на список или массив объекты. С этими значениями с правой стороны списка выбора будет заполнено.

  • #{aBean.leftSideValues} должен указывать на список SelectItem объект.

ONE NOTICE - объект 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. Во внутренних объектах богатые лица будут сравнивать объекты из "#{aBean.rightSideValues}" с объектами из #{aBean.leftSideValues} с помощью метода

SomeObject.equals()

3 голосов
/ 08 мая 2009

Вы хотите этот код:

<h:outputText value="Roles" />
<rich:pickList showButtonsLabel="false" value="#{bean.chosenRoles}">
    <f:selectItems value="#{Bean.allRoles}" />
</rich:pickList>

и в своем бобе вы хотите:

private String[] chosenRoles;

+ getter/setter 

Когда вы хотите создать роли по умолчанию, вы просто добавляете роли в массив selectedRoles (например, в конструкторе компонентов). Таким образом, selectedRoles всегда будет содержать элементы с правой стороны списка выбора, а элементы с левой стороны - не в массиве.

Надеюсь, это поможет!

1 голос
/ 05 сентября 2013

Как и в RF 4.3.3 и, возможно, ранее, вам также необходимо переопределить метод хеширования вашего класса модели (объекта EJB). Таким образом, недостаточно только переопределить метод 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());
    }
1 голос
/ 05 августа 2010

Если вам нужны значения, отличные от текста, вам нужно сделать конвертер.

См. http://programmingnutsandbolts.blogspot.com/2009/08/richfaces-picklist-converters.html

0 голосов
/ 08 мая 2009

Установить значение pickList равным массиву значений SelectItem.

То, с чего вы начинаете с правой стороны, будет просто значением по умолчанию для pickList:

    <rich:pickList value="#{aBean.rightSideValues}"> 
        <f:selectItems value="#{aBean.leftSideValues}"/>
    </rich:pickList>
...