如何填充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<SelectItem>
。
我需要能够在列表 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 选项列表的右侧?的主要内容,如果未能解决你的问题,请参考以下文章