2009-05-08 15 views
8

J'utilise un picklist de Richfaces et je veux remplir le panneau de droite avec une liste de SelectItems de mon bean backing.Comment remplir le côté droit d'une liste de sélection richfaces?

Le remplissage du côté gauche n'est pas un problème du support, cependant, le côté droit est problématique.

C'est ce que j'ai actuellement

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

EDIT:

J'ai rôles 'a', 'b', 'c' et 'd'. L'utilisateur a les rôles 'a' et 'd', donc 'a' et 'd' devraient être sur le panneau de droite et 'b' et 'c' devraient être sur le panneau de gauche.

EDIT:

explication.

J'ai trois listes pour l'utilisateur.

  1. Tous les rôles posible (a à d)
  2. Tous les rôles que l'utilisateur fait partie de (a et d)
  3. Tous les rôles que l'utilisateur ne fait pas partie (b et c)

Toutes les listes ont le type de données ArrayList<SelectItem>.

J'ai besoin de la possibilité de déplacer des rôles individuels entre la liste numéro 1 et la liste numéro 2, puis de sauvegarder le nouvel ensemble de rôles. Je pensais que la liste de sélection serait le meilleur objet richfaces pour le travail.

Répondre

3

Vous voulez ce code:

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

et dans votre bean voulez:

private String[] chosenRoles; 

+ getter/setter 

Lorsque vous voulez faire des rôles par défaut, vous ajoutez simplement les rôles dans le choix Tableau nRoles (par exemple dans le constructeur du bean). De cette façon, selectedRoles contiendra toujours les éléments du côté droit de la liste de sélection, tandis que les éléments du côté gauche ne sont pas dans le tableau.

Espérons que cela aide!

+1

Pourquoi chaîne []? Ne peut-il être Liste avec un convertisseur fourni? –

0

Définissez la valeur de pickList sur un tableau de la valeur de SelectItem.

Tout ce que vous commencez avec le côté droit sera alors essentiellement juste être la valeur par défaut du pickList:

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

Je suis l'essayer ... Je reçois une erreur: java.lang.IllegalArgumentException: La valeur est accumulez pas merci et je continue à essayer de nouvelles choses. –

+0

Désolé. Vous voulez en fait que ce soit la * valeur * du selectItem, pas le selectItem lui-même. –

6

Il semble que j'ai trouvé la solution.

<rich:pickList value="#{aBean.rightSideValues}"> 
     <f:selectItems value="#{aBean.leftSideValues}"/> 
</rich:pickList> 
  • "#{aBean.rightSideValues}" doit pointer sur la liste ou un tableau de objets. Avec ces valeurs, le côté droit de la liste de sélection sera rempli.

  • #{aBean.leftSideValues} doit pointer sur la liste de l'objet SelectItem .

UN AVIS - SelectItem objet doit être construit avec des objets de la "#{aBean.rightSideValues}".

Exemple.

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

Notez que SelectItem prend le premier argument et que cet argument est la référence à SomeObject. Dans les entrailles des visages riches compareront objets du "#{aBean.rightSideValues}" avec des objets de la #{aBean.leftSideValues} avec l'aide de la méthode

SomeObject.equals()

+0

+1 pour nous donner une explication très complète de l'ensemble du processus de construction des listes, et de la comparaison entre les objets, ce qui n'est pas ** spécifié dans la documentation officielle (http://docs.jboss.org/richfaces /latest_3_3_X/en/devguide/html_single/index.html). Je vous remercie! –

1

Comme dans RF 4.3.3 et probablement plus tôt, vous devez également trop pour remplacer la méthode de hachage de votre classe de modèle (bean entité). Donc, seulement substituer la méthode égale à votre convertisseur n'est pas suffisant. Ce qui suit a fonctionné pour moi et mon bean entité 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()); 
    }