2010-03-07 70 views
3

我是Richfaces组件的新手。当我使用<rich:listShuttle>时,targetValue中指定的Arraylist现在正在使用最新数据进行更新?为什么richFaces中的listShuttle组件没有得到更新?

MyJSF文件

<a4j:region> 
<rich:listShuttle sourceValue="#{bean.selectItems}" id="one" 
targetValue="#{bean.selectItemsone}" var="items" listsHeight="150" 
sourceListWidth="130" targetListWidth="130" 
sourceCaptionLabel="Intial Items" 
targetCaptionLabel="Selected Items" converter="Listconverter"> 
    <rich:column> 
     <h:outputText value="#{items.value}"></h:outputText> 
    </rich:column> 
</rich:listShuttle> 
</a4j:region> 
<a4j:region> 
<a4j:commandButton value="Submit" action="#{bean.action}" /> 
</a4j:region> 

我的Managed Bean的

private List<String> selectedData; 
private List<BeanItems> selectItems; 
private List<BeanItems> selectItemsone; 

public String action() { 
    System.out.println(selectItems); 
    System.out.println(selectItemsone); 
    System.out.println("Select Item List"); 
    Iterator<BeanItems> iterator = selectItems.iterator(); 
    while (iterator.hasNext()) { 
     BeanItems item = (BeanItems) iterator.next(); 
     System.out.println(item.getValue()); 
    } 
    System.out.println("/nSelect Item one list "); 
    Iterator<BeanItems> iterator2 = selectItemsone.iterator(); 
    while (iterator2.hasNext()) { 
     BeanItems item = (BeanItems) iterator2.next(); 
     System.out.println(item.getValue()); 
    } 
    return ""; 
} 

public void setSelectedData(List<String> selectedData) { 
    this.selectedData = selectedData; 
} 

public List<String> getSelectedData() { 
    return selectedData; 
} 

/** 
* @return the selectItems 
*/ 
public List<BeanItems> getSelectItems() { 
    if (selectItems == null) { 
     selectItems = new ArrayList<BeanItems>(); 
     selectItems.add(new BeanItems("value4", "label4")); 
     selectItems.add(new BeanItems("value5", "label5")); 
     selectItems.add(new BeanItems("value6", "label6")); 
     selectItems.add(new BeanItems("value7", "label7")); 
     selectItems.add(new BeanItems("value8", "label8")); 
     selectItems.add(new BeanItems("value9", "label9")); 
     selectItems.add(new BeanItems("value10", "label10")); 

    } 
    return selectItems; 
} 

/** 
* @return the selectItemsone 
*/ 
public List<BeanItems> getSelectItemsone() { 
    if (selectItemsone == null) { 
     selectItemsone = new ArrayList<BeanItems>(); 
     selectItemsone.add(new BeanItems("value1", "label1")); 
     selectItemsone.add(new BeanItems("value2", "label2")); 
     selectItemsone.add(new BeanItems("value3", "label3")); 
    } 
    return selectItemsone; 
} 

我的转换器类

public Object getAsObject(FacesContext context, UIComponent component,String value) { 
      int index = value.indexOf(':'); 
      return new BeanItems(value.substring(0, index), value.substring(index + 1)); 
     } 

public String getAsString(FacesContext context, UIComponent component,Object value) { 
      BeanItems beanItems = (BeanItems) value; 
      return beanItems.getValue() + ":" + beanItems.getData(); 
     } 

我BeanItems类

private String data; //Getter & setter 
private String value; //Getter & setter 

public BeanItems() { 

} 

public BeanItems(String value, String data) { 
    this.value = value; 
    this.data = data; 
} 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((data == null) ? 0 : data.hashCode()); 
    result = prime * result + ((value == null) ? 0 : value.hashCode()); 
    return result; 
} 

public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    final BeanItems other = (BeanItems) obj; 
    if (data == null) { 
     if (other.data != null) 
      return false; 
    } else if (!data.equals(other.data)) 
     return false; 
    if (value == null) { 
     if (other.value != null) 
      return false; 
    } else if (!value.equals(other.value)) 
     return false; 
    return true; 
} 
+1

我没有与RichFaces的丰富的实践经验,所以我可能是错的,但它不应该全部是** **一样'A4J里面:region'? – BalusC 2010-03-07 17:50:09

+0

当我但同一地区内的所有组件,指定的命令按钮的操作方法不会被调用,就像按钮本身不活动。 – Hariharbalaji 2010-03-08 03:49:03

+0

感谢daedlus和BalusC乌拉圭回合的答案和提示,在问题解决 – Hariharbalaji 2010-03-08 05:25:15

回答

2

如果你的问题是目标列表不getitng填充的话,我想你应该重载equals,对包装对象[BeanItem]散列码的方法,因为你是转换器每次在getAsObject方法中构造新的对象。

也可以尝试把一个H:包裹在--a4j消息标签:outputPanel ajaxRendered =“真” - 在你的页面打印可能会得到产生的任何转换错误。

+0

@daedlus:我有overrided散列码与已经,我已经加了我BeanItem类的问题equals方法。 – Hariharbalaji 2010-03-08 04:44:52

+0

如果我做了一些错误的东西,同时覆盖方法,请提及它,并感谢您的意见 – Hariharbalaji 2010-03-08 04:46:37

+0

@daedlus:感谢您的回答了现在的工作。即使comman按钮位于区域内部或外部 – Hariharbalaji 2010-03-08 05:24:16