Как заполнить правую часть раскрывающегося списка richfaces?

StackOverflow https://stackoverflow.com/questions/839893

  •  22-07-2019
  •  | 
  •  

Вопрос

Я использую 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" - на левой.

Редактировать:

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

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

  1. Все возможные роли (от a до d)
  2. Все роли, частью которых является пользователь (a и d)
  3. Все роли, частью которых пользователь НЕ является (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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top