如何填充richfaces选项列表的右侧?

时间:2009-05-08 13:55:44

标签: java jsf richfaces

我正在使用Richfaces'picklist,我想在右侧面板中填充来自我的支持bean的SelectItems列表。

填充左侧不是来自辅助bean的问题,但右侧是有问题的。

这就是我目前所拥有的

<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. 所有可能的角色(通​​过)
  2. 用户所属的所有角色(a和d)
  3. 用户不属于(b和c)的所有角色
  4. 所有列表的数据类型都为ArrayList<SelectItem>

    我需要能够在列表编号1和列表编号2之间移动单个角色,然后保存新的角色集。我认为该选项列表将是该工作的最佳richfaces对象。

5 个答案:

答案 0 :(得分:6)

似乎我找到了解决方案。

<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()

答案 1 :(得分:3)

您需要此代码:

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

并在你想要的bean中:

private String[] chosenRoles;

+ getter/setter 

当您想要创建默认角色时,只需将角色添加到selectedRoles数组中(例如在bean构造函数中)。这样,selectedRoles将始终包含选项列表右侧的元素,而左侧的元素不在数组中。

希望这有帮助!

答案 2 :(得分:1)

如果您需要文本以外的值,则需要制作转换器。

请参阅http://programmingnutsandbolts.blogspot.com/2009/08/richfaces-picklist-converters.html

答案 3 :(得分:1)

与RF 4.3.3一样,也可能更早,您还需要覆盖模型类(实体bean)的哈希方法。因此,仅覆盖转换器的equals方法是不够的。以下内容适用于我和我的PubThread实体bean。

    @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());
    }

答案 4 :(得分:0)

将pickList的值设置为SelectItem值的数组。

无论你从右手边开始,基本上只是pickList的默认值:

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