¿Cómo llenar el lado derecho de una lista de selección de richfaces?
Pregunta
Estoy usando un Richfaces ' picklist y quiero llenar el panel del lado derecho con una lista de SelectItems de mi bean de respaldo.
Rellenar el lado izquierdo no es un problema desde el bean de 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:
Entonces tengo los roles 'a', 'b', 'c' y 'd'.
El usuario tiene los roles 'a' y 'd', por lo que 'a' y 'd' deben estar en el panel del lado derecho y 'b' y 'c' deben estar en el panel del lado izquierdo.
EDIT:
Explicación adicional.
Tengo tres listas para el usuario.
- Todos los roles posibles (a través de d)
- Todos los roles de los que el usuario forma parte (ayd)
- Todos los roles de los que el usuario NO forma parte (byc)
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.
Solución
Desea este código:
<h:outputText value="Roles" />
<rich:pickList showButtonsLabel="false" value="#{bean.chosenRoles}">
<f:selectItems value="#{Bean.allRoles}" />
</rich:pickList>
y en tu bean quieres:
private String[] chosenRoles;
+ getter/setter
Cuando quiera hacer roles predeterminados, simplemente agregue los roles en la matriz de Roles elegida (por ejemplo, en el constructor de beans). De esa manera, elegidoRoles siempre contendrá 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!
Otros consejos
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 del lado derecho de la lista de selección se completará.#{aBean.leftSideValues}
debe apuntar a la lista de SelectItem objeto.
UN AVISO: el objeto SelectItem DEBE SER construido con objetos del SomeObject.equals()
.
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;
}
Observe que SelectItem toma el primer argumento y este argumento es la referencia a SomeObject. En las partes internas, las caras ricas compararán objetos de <=> con objetos de <=> con ayuda del método
<=>
Si necesita valores distintos al texto, debe hacer un convertidor.
Ver http://programmingnutsandbolts.blogspot.com/2009/ 08 / richfaces-picklist-converters.html
Como en RF 4.3.3 y probablemente también antes, también debe anular el método hash de su clase de modelo (bean de entidad). Por lo tanto, solo anular el método de igualdad 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());
}
Establezca el valor de pickList en una matriz del valor de SelectItem.
Lo que sea que comience en el lado derecho básicamente será el valor predeterminado de la lista de selección:
<rich:pickList value="#{aBean.rightSideValues}">
<f:selectItems value="#{aBean.leftSideValues}"/>
</rich:pickList>