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

Posted

技术标签:

【中文标题】如何填充richfaces 选项列表的右侧?【英文标题】:How to populate the right side of a richfaces picklist? 【发布时间】: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”应位于左侧面板。

编辑:

进一步解释。

我有三个用户列表。

    所有可能的角色(a 到 d) 用户所属的所有角色(a 和 d) 用户不属于的所有角色(b 和 c)

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

我需要能够在列表 1 和列表 2 之间移动各个角色,然后保存新的角色集。我认为选择列表将是这项工作的最佳 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 本身。

以上是关于如何填充richfaces 选项列表的右侧?的主要内容,如果未能解决你的问题,请参考以下文章

选项卡索引不起作用richfaces 弹出面板

如何使用惯用的Scala替换(填充)来自另一个列表的选项列表中的None条目?

如何在 SwiftUI 中的表单段上添加填充

如何从模型中获取唯一的选项列表以填充选择框

如何从动态填充的下拉列表中动态选择一个选项

如何使用下拉列表的不同选项自动填充编辑字段?