2009-05-08 10 views
8

Używam Richfaces 'picklist i chcę zapełnić prawy panel z listą SelectItems z mojego komponentu bean.Jak wypełnić prawą stronę listy wyboru richfaces?

Wypełnianie lewej strony nie stanowi problemu z podkładki, jednak problem z prawą stroną.

To co obecnie mam

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

EDIT:

Więc mam role 'a', 'b', 'c' i 'd'.

Użytkownik ma role "a" i "d", więc "a" i "d" powinny znajdować się na prawym panelu, a "b" i "c" na lewym panelu.

EDIT:

Dalsze wyjaśnienia.

Mam trzy listy dla użytkownika.

  1. Wszystkie role posible (a thru d)
  2. wszystkich zadań użytkownika jest część (A i D)
  3. Wszystkie role użytkownika nie jest częścią (B i C)

Wszystkie listy mają typ danych: ArrayList<SelectItem>.

Potrzebuję możliwości przenoszenia poszczególnych ról między listą numer 1 i listą 2, a następnie zapisz nowy zestaw ról. Pomyślałem, że lista wyboru będzie najlepszym obiektem do richfaces dla tego zadania.

Odpowiedz

3

Chcesz ten kod:

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

iw swoim fasoli ty chcesz:

private String[] chosenRoles; 

+ getter/setter 

Kiedy chcesz ustawić domyślne role, po prostu dodajesz role do wybranych tablica nRoles (na przykład w konstruktorze komponentów bean). W ten sposób selectedRoles zawsze będzie zawierał elementy po prawej stronie listy wyboru, podczas gdy elementy po lewej stronie nie znajdują się w tablicy.

Mam nadzieję, że to pomoże!

+1

Dlaczego String []? Czy to nie może być lista z dołączonym konwerterem? –

0

Ustawia wartość opcji pickList na tablicę wartości SelectItem.

Cokolwiek rozpocząć się po prawej stronie będą wtedy w zasadzie tylko mieć wartość domyślną PickList:

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

próbuję go ... Ja otrzymuję błąd: java.lang.IllegalArgumentException: Wartość nie jest String dzięki i ciągle próbuje nowych rzeczy. –

+0

Przepraszamy. W rzeczywistości chcesz, aby była to * wartość * elementu selectItem, a nie sam selectItem. –

6

Wygląda na to, że znalazłem rozwiązanie.

<rich:pickList value="#{aBean.rightSideValues}"> 
     <f:selectItems value="#{aBean.leftSideValues}"/> 
</rich:pickList> 
  • "#{aBean.rightSideValues}" powinien wskazywać na listy lub tablicy przedmiotów. Z tymi wartościami zostanie wyświetlona strona prawa z listy wyboru.

  • #{aBean.leftSideValues} powinien wskazywać na liście obiektu SelectItem .

zauważyć - SelectItem obiekt musi być zbudowany z obiektów z "#{aBean.rightSideValues}".

Przykład.

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

Zauważ, że SelectItem pobiera pierwszy argument, a ten argument jest odniesieniem do SomeObject. W wewnętrznych bogatych twarze porównać obiekty z "#{aBean.rightSideValues}" z obiektów z #{aBean.leftSideValues} z pomocą metody

SomeObject.equals()

+0

+1 za udzielenie nam pełnego wyjaśnienia całego procesu konstruowania list oraz porównania między obiektami, które ** nie są nawet ** określone w oficjalnej dokumentacji (http://docs.jboss.org/richfaces /latest_3_3_X/en/devguide/html_single/index.html). Dziękuję Ci! –

1

jak w RF 4.3.3 i prawdopodobnie wcześniej też trzeba także zastąpić metodę skrótu swojej klasie modelu (podmiot fasoli). A więc tylko przesłonięcie metody równości dla twojego konwertera nie wystarczy. Poniższe elementy opracowano dla mnie i mojej fasoli encji 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()); 
    } 
Powiązane problemy