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

Java 如何填充richfaces选取列表的右侧?,java,jsf,richfaces,Java,Jsf,Richfaces,我正在使用Richfaces,我想用我的支持bean中的SelectItems列表填充右侧面板 填充左侧不是backingbean的问题,但是,右侧是有问题的 这就是我现在拥有的 <h:outputText value="Roles" /> <rich:pickList showButtonsLabel="false"> <f:selectItems value="#{Bean.allRoles}" /> </rich:pickList>

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

填充左侧不是backingbean的问题,但是,右侧是有问题的

这就是我现在拥有的

<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


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

    将选取列表的值设置为SelectItem值的数组

    无论您从右侧开始使用什么,基本上都只是选择列表的默认值:

        <rich:pickList value="#{aBean.rightSideValues}"> 
            <f:selectItems value="#{aBean.leftSideValues}"/>
        </rich:pickList>
    
    
    
    您需要此代码:

    <h:outputText value="Roles" />
    <rich:pickList showButtonsLabel="false" value="#{bean.chosenRoles}">
        <f:selectItems value="#{Bean.allRoles}" />
    </rich:pickList>
    
    当您想要创建默认角色时,只需将这些角色添加到chosenRoles数组中(例如在bean构造函数中)。这样,chosenRoles将始终包含拾取列表右侧的元素,而左侧的元素不在数组中


    希望这有帮助

    看来我找到了解决办法

    <rich:pickList value="#{aBean.rightSideValues}"> 
            <f:selectItems value="#{aBean.leftSideValues}"/>
    </rich:pickList>
    
    请注意,SelectItem接受第一个参数,该参数是对SomeObject的引用。在内部文件中,rich faces将比较来自
    “#{aBean.rightSideValues}”的对象与来自
    
    {aBean.leftSideValues}
    借助该方法


    SomeObject.equals()

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


    参见rf4.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());
        }
    

    我正在尝试…我得到一个错误:java.lang.IllegalArgumentException:值不是字符串谢谢,我一直在尝试新的东西。对不起。实际上,您希望它是selectItem的值,而不是selectItem本身。+1为我们提供了一个非常完整的列表构建过程的解释,以及对象之间的比较,这在官方文档中甚至没有指定()。非常感谢。为什么使用字符串[]?它不能是带有转换器的列表吗?
    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;
    }
    
        @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());
        }