2009-05-08 22 views
8

Tôi đang sử dụng Richfaces 'picklist và tôi muốn điền bảng điều khiển bên phải với danh sách các SelectItems từ bean sao lưu của tôi.Cách điền vào phần bên phải của danh sách lựa chọn đa dạng?

Populating bên trái không phải là một vấn đề từ đậu ủng hộ, tuy nhiên, phía bên tay phải là vấn đề.

Đây là những gì tôi đang có

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

EDIT:

Vì vậy, tôi có vai trò 'a', 'b', 'c', và 'd'.

Người dùng có vai trò 'a' và 'd', vì vậy 'a' và 'd' phải ở trên bảng điều khiển bên phải và 'b' và 'c' phải ở trên bảng điều khiển bên trái.

EDIT:

Tiếp tục giải thích.

Tôi có ba danh sách cho người dùng.

  1. Tất cả các vai trò posible (a đến d)
  2. Tất cả các vai trò người sử dụng là một phần của (a, d)
  3. Tất cả các vai trò người sử dụng là không một phần của (b, c)

Tất cả các danh sách có kiểu dữ liệu ArrayList<SelectItem>.

Tôi cần khả năng di chuyển các vai trò riêng lẻ giữa danh sách số 1 và danh sách số 2 và sau đó lưu tập hợp vai trò mới. Tôi nghĩ rằng danh sách chọn lựa sẽ là đối tượng richfaces tốt nhất cho công việc.

Trả lời

3

Bạn muốn mã này:

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

và trong đậu của bạn, bạn muốn:

private String[] chosenRoles; 

+ getter/setter 

Khi bạn muốn tạo vai trò mặc định, bạn chỉ cần thêm vai trò vào lựa chọn mảng nRoles (ví dụ trong hàm tạo bean). Bằng cách đó, selectionRoles sẽ luôn chứa các phần tử ở phía bên phải của danh sách chọn, trong khi các phần tử ở phía bên trái không nằm trong mảng.

Hy vọng điều này sẽ hữu ích!

+1

Tại sao String []? Không thể là Danh sách có trình chuyển đổi được cung cấp? –

0

Đặt giá trị của danh sách lựa chọn thành một mảng giá trị của SelectItem.

Dù bạn bắt đầu với ở phía bên tay phải sẽ sau đó về cơ bản chỉ là giá trị mặc định của pickList:

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

tôi đang cố gắng nó ra ... tôi đang nhận được một lỗi: java.lang.IllegalArgumentException: Giá trị không phải là chuỗi cảm ơn và tôi tiếp tục cố gắng những điều mới mẻ. –

+0

Xin lỗi. Bạn thực sự muốn nó là giá trị * của selectItem, chứ không phải chính selectItem. –

6

Dường như tôi đã tìm ra giải pháp.

<rich:pickList value="#{aBean.rightSideValues}"> 
     <f:selectItems value="#{aBean.leftSideValues}"/> 
</rich:pickList> 
  • "#{aBean.rightSideValues}" phải trỏ đến danh sách hoặc mảng của đối tượng. Với các giá trị này, bên phải của danh sách chọn sẽ được điền.

  • #{aBean.leftSideValues} nên trỏ đến danh sách đối tượng SelectItem .

ONE THÔNG BÁO - đối tượng SelectItem phải được xây dựng với các đối tượng từ "#{aBean.rightSideValues}".

Ví dụ.

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

Lưu ý rằng SelectItem lấy đối số đầu tiên và đối số này là tham chiếu đến SomeObject. Trong internals khuôn mặt giàu sẽ so sánh các đối tượng từ "#{aBean.rightSideValues}" với các đối tượng từ #{aBean.leftSideValues} với sự giúp đỡ của phương pháp

SomeObject.equals()

+0

+1 để cho chúng tôi một lời giải thích đầy đủ về toàn bộ quá trình xây dựng danh sách và so sánh giữa các đối tượng, ** không được chỉ định ** trong tài liệu chính thức (http://docs.jboss.org/richfaces /latest_3_3_X/en/devguide/html_single/index.html). Cảm ơn bạn! –

1

Như trong RF 4.3.3 và có lẽ trước đó, cũng vậy, bạn cũng cần phải ghi đè lên các phương pháp hash của mô hình lớp (entity bean) của bạn. Vì vậy, chỉ ghi đè phương pháp bằng cho công cụ chuyển đổi của bạn là không đủ. Sau đây làm việc cho tôi và đậu thực thể PubThread của tôi.

@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()); 
    } 
Các vấn đề liên quan