2009-05-08 37 views
8

Estoy usando un Richfaces 'picklist y quiero rellenar el panel del lado derecho con una lista de SelectItems de mi bean de respaldo.¿Cómo rellenar el lado derecho de una lista de selección de richfaces?

Polarizar el lado izquierdo no es un problema del respaldo, sin embargo, el lado derecho es problemático.

Esto es lo que tengo actualmente

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

EDIT:

Así que tengo papeles 'a', 'b', 'c' y 'd'.

El usuario tiene las funciones 'a' y 'd', por lo que 'a' y 'd' deben estar en el panel derecho y 'b' y 'c' en el panel izquierdo.

EDIT:

una explicación más detallada.

Tengo tres listas para el usuario.

  1. Todos los roles Posible (a través d)
  2. Todos los roles el usuario es parte de (a y d)
  3. Todas las funciones que el usuario no es parte de (b y c)

Todas las listas tienen el tipo de datos ArrayList<SelectItem>.

Necesito la capacidad de mover roles individuales entre la lista número 1 y la lista número 2 y luego guardar el nuevo conjunto de roles. Pensé que la lista de selección sería el mejor objeto de richfaces para el trabajo.

Respuesta

3

¿Quieres este código:

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

y en el bean se quiere:

private String[] chosenRoles; 

+ getter/setter 

Cuando quiera realizar roles predeterminados, solo agregue los roles en el lugar elegido nRoles array (por ejemplo, en el constructor de bean). De esta forma, las páginas elegidas siempre contendrán los elementos en el lado derecho de la lista de selección, mientras que los elementos en el lado izquierdo no están en la matriz.

Espero que esto ayude!

+1

¿Por qué Cadena []? ¿No puede ser List con un convertidor proporcionado? –

0

Establezca el valor de la lista de selección en una matriz del valor de Seleccionar elemento.

Lo que se empieza con en el lado derecho entonces, básicamente, sólo ser el valor por defecto de la lista de selección:

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

Estoy intentando que fuera ... que estoy recibiendo un error: java.lang.IllegalArgumentException: El valor no es String gracias y sigo intentando cosas nuevas. –

+0

Lo siento. De hecho, desea que sea el * valor * del elemento de selección, no el elemento de selección en sí. –

6

Parece que encontré la solución.

<rich:pickList value="#{aBean.rightSideValues}"> 
     <f:selectItems value="#{aBean.leftSideValues}"/> 
</rich:pickList> 
  • "#{aBean.rightSideValues}" debe apuntar a la lista o matriz de objetos. Con estos valores, se completará el lado derecho de la lista de selección.

  • #{aBean.leftSideValues} debe apuntar a la lista del objeto SelectItem .

ONE AVISO - objeto SelectItem deben construirse con objetos de la "#{aBean.rightSideValues}".

Ejemplo.

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; 
} 

en cuenta que una toma SelectItem primer argumento y este argumento es la referencia a la SomeObject. En la parte interna caras ricos compararán objetos de la "#{aBean.rightSideValues}" con objetos de la #{aBean.leftSideValues} con la ayuda del método

SomeObject.equals()

+0

+1 por darnos una explicación muy completa de todo el proceso de construcción de listas, y la comparación entre los objetos, que ** ni siquiera ** se especifica en la documentación oficial (http://docs.jboss.org/richfaces /latest_3_3_X/en/devguide/html_single/index.html). ¡Gracias! –

1

Como en RF 4.3.3 y probablemente antes, también, también es necesario reemplazar el método de hash de la clase del modelo (bean de entidad). Por lo tanto, solo reemplazar el método equals para su convertidor no es suficiente. Lo siguiente funcionó para mí y mi bean de entidad PubThread.

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