2009-05-08 13 views
8

Ich verwende eine Richfaces 'picklist und ich möchte die rechte Seite mit einer Liste von SelectItems aus meiner Backing-Bean auffüllen.Wie füllt man die rechte Seite einer Richfacts-Auswahlliste auf?

Das Füllen der linken Seite ist kein Problem von der Backing Bean, die rechte Seite ist jedoch problematisch. Diese

ist, was zur Zeit ich habe

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

EDIT:

So habe ich Rollen 'a', 'b', 'c' und 'd'.

Der Benutzer hat die Rollen 'a' und 'd', also sollten 'a' und 'd' auf der rechten Seite und 'b' und 'c' auf der linken Seite sein.

EDIT:

Eine weitere Erklärung.

Ich habe drei Listen für den Benutzer.

  1. Alle posible Rollen (a bis d)
  2. alle Rollen ist der Benutzer in Teil (a und d)
  3. Alle Rollen der Benutzer nicht ein Teil ist (b und c)

Alle Listen haben den Datentyp ArrayList<SelectItem>.

Ich brauche die Möglichkeit, einzelne Rollen zwischen Liste Nummer 1 und Nummer 2 zu verschieben und dann die neue Rolle zu speichern. Ich dachte, die Auswahlliste wäre das beste Richface-Objekt für den Job.

Antwort

3

Sie wollen diesen Code:

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

und in Ihrem Bean Sie wollen:

private String[] chosenRoles; 

+ getter/setter 

Whenver Sie Standardrollen Sie nur die Rollen fügen in die wählten machen wollen nRoles-Array (zum Beispiel im Bean-Konstruktor). Auf diese Weise enthalten ausgewählteRole immer die Elemente auf der rechten Seite der Auswahlliste, während Elemente auf der linken Seite nicht im Array enthalten sind.

Hoffe, das hilft!

+1

Warum Zeichenfolge []? Kann es nicht sein Liste mit einem Konverter zur Verfügung gestellt? –

0

Legen Sie den Wert der Auswahlliste auf ein Array des Werts von SelectItem fest.

Was auch immer Sie mit auf der rechten Seite beginnen wird dann im Grunde nur den Standardwert der Auswahlliste:

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

ich versuche es aus ... Ich erhalte eine Fehlermeldung: java.lang.IllegalArgumentException: Der Wert ist nicht String Dank und ich immer wieder neue Dinge zu versuchen. –

+0

Entschuldigung. Sie möchten, dass es der * Wert * des selectItem ist, nicht das selectItem selbst. –

6

Es scheint, dass ich die Lösung gefunden habe.

<rich:pickList value="#{aBean.rightSideValues}"> 
     <f:selectItems value="#{aBean.leftSideValues}"/> 
</rich:pickList> 
  • "#{aBean.rightSideValues}" zu der Liste oder einer Anordnung von Objekten anweisen. Mit diesen Werten wird die rechte Seite der Auswahlliste ausgefüllt.

  • #{aBean.leftSideValues} in die Liste des SelectItem Objekt zeigen sollte.

ONE HINWEIS - SelectItem Objekt muss mit Objekten aus dem "#{aBean.rightSideValues}" konstruiert werden.

Beispiel.

Beachten Sie, dass SelectItem das erste Argument übernimmt und dieses Argument der Verweis auf SomeObject ist. In den Einbauten werden reich Gesichter vergleichen Objekte aus dem "#{aBean.rightSideValues}" mit Objekten aus dem #{aBean.leftSideValues} mit Hilfe der Methode

SomeObject.equals()

+0

+1 für uns eine sehr vollständige Erklärung des gesamten Prozesses der Konstruktion von Listen und der Vergleich zwischen Objekten, die ** nicht einmal ** in der offiziellen Dokumentation (http://docs.jboss.org/richfaces /latest_3_3_X/de/devguide/html_single/index.html). Vielen Dank! –

1

Wie in RF 4.3.3 und wahrscheinlich früher auch Sie müssen auch die Hash-Methode Ihrer Modellklasse (Entity-Bean) außer Kraft setzen. Daher reicht es nicht aus, die equals-Methode für Ihren Konverter zu überschreiben. Folgendes wurde für mich und meine PubThread-Entity-Bean ausgearbeitet.

@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()); 
    } 
Verwandte Themen