【问题标题】:How to populate the right side of a richfaces picklist?如何填充richfaces 选项列表的右侧?
【发布时间】:2010-10-24 19:17:42
【问题描述】:

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

从 backing 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. 所有可能的角色(a 到 d)
  2. 用户所属的所有角色(a 和 d)
  3. 用户不属于的所有角色(b 和 c)

所有列表的数据类型均为ArrayList&lt;SelectItem&gt;

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

【问题讨论】:

    标签: java jsf richfaces


    【解决方案1】:

    就像在 RF 4.3.3 和更早的版本中一样,您还需要覆盖模型类(实体 bean)的 hash 方法。因此,仅覆盖转换器的 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());
        }
    

    【讨论】:

      【解决方案2】:

      看来我找到了解决办法。

      <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 的引用。在内部,富人脸会将来自 "#{aBean.rightSideValues}" 的对象与来自 #{aBean.leftSideValues}借助方法

      SomeObject.equals()

      【讨论】:

      • +1 非常完整地解释了列表的整个构建过程,以及对象之间的比较,这是官方文档中甚至指定的(@ 987654321@)。谢谢!
      【解决方案3】:

      如果你需要文本以外的值,你需要做一个转换器。

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

      【讨论】:

        【解决方案4】:

        你想要这个代码:

        <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 将始终包含选项列表右侧的元素,而左侧的元素不在数组中。

        希望这会有所帮助!

        【讨论】:

        • 为什么是字符串[]?不能是提供转换器的 List 吗?
        【解决方案5】:

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

        无论你从右侧开始什么,基本上都是pickList的默认值:

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

        【讨论】:

        • 我正在尝试...我收到一个错误:java.lang.IllegalArgumentException: Value is not String 谢谢,我一直在尝试新事物。
        • 对不起。您实际上希望它是 selectItem 的 ,而不是 selectItem 本身。
        猜你喜欢
        • 2012-01-04
        • 2013-08-19
        • 1970-01-01
        • 2012-10-30
        • 2020-02-16
        • 2023-02-25
        • 2013-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多