2014-09-19 47 views
0

我有selectManyCheckbox,但我無法從更改事件後檢查值(選定值列表保持空白)。 更改事件被觸發,但在調試模式下,listSelectedSignalCauses中沒有值。 我試圖設置一些轉換器,但它也沒有幫助(也許這是錯誤的轉換器)。Primefaces selectManyCheckbox

<p:selectManyCheckbox value="#{SignalAnalysisBean.listSelectedSignalCauses}" layout="pageDirection" styleClass="lstSignal"> 
    <f:selectItems value="#{SignalAnalysisBean.listSignalCauses}" var="causes" itemValue="#{causes}" itemLabel="#{causes.name}" /> 
    <p:ajax process="@this" update="test" event="change" listener="#{SignalAnalysisBean.checkCausesList}" /> 
        </p:selectManyCheckbox> 
<h:outputText value="#{SignalAnalysisBean.arrSize}" id="test" /> 
public class SignalAnalysisBean extends AbstractBean { 
    private List<GeneralCollDTO> listSignalCauses; 
    private List<GeneralCollDTO> listSelectedSignalCauses; 
    //... 

    public void checkCausesList(){ 
     arrSize = 4 + listSelectedSignalCauses.size(); 
    } 
    //... 
} 

public class GeneralCollDTO { 
    private String name; 
    private String value; 

    public GeneralCollDTO() { } 

    public GeneralCollDTO(String n, String v) { 
     this.name = n; 
     this.value = v; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 
} 

回答

1

最後我最終得到了適用於我的通用轉換器。

@FacesConverter(value = "generalCollDTOConverter", forClass = GeneralCollDTOConverter.class) 
public class GeneralCollDTOConverter implements Converter { 

    private static Map<Object, String> entities = new HashMap<Object, String>(); 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
    synchronized (entities) { 
     if (!entities.containsKey(value)) { 
      String uuid = UUID.randomUUID().toString(); 
      entities.put(value, uuid); 
      return uuid; 
     } else { 
      return entities.get(value); 
     } 
    } 
    } 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
    for (Entry<Object, String> entry : entities.entrySet()) { 
     if (entry.getValue().equals(value)) { 
      System.out.println("getKey:" + entry.getKey()); 
      return entry.getKey(); 
     } 
    } 
    return value; 
    } 
} 
1

爲了一個自定義的對象發送到你需要實現一個轉換器的託管bean,否則你將無法做到這一點。下面的代碼根據你的代碼實現它,它可能是解決問題的辦法。

@FacesConverter(value = "generalCollDTOConverter", forClass = GeneralCollDTOConverter.class) 
public class GeneralCollDTOConverter implements Converter { 

    @Override 
    public Object getAsObject(FacesContext ctx, UIComponent component, String value) { 
     if (value != null) { 
      return component.getAttributes().get(value); 
     } 
     return null; 
    } 

    @Override 
    public String getAsString(FacesContext ctx, UIComponent component, Object value) { 
     if (value != null && value instanceof GeneralCollDTO) { 
      GeneralCollDTO generalCollDTO = (GeneralCollDTO) value; 

      if (generalCollDTO.getName() != null) { 
       component.getAttributes().put(generalCollDTO.getName(), value); 
       return generalCollDTO.getName(); 
      } 
     } 
     return null; 
    } 
} 



<p:selectManyCheckbox converter="generalCollDTOConverter" value="#{SignalAnalysisBean.listSelectedSignalCauses}" layout="pageDirection" styleClass="lstSignal"> 
+0

仍然無法正常工作。我添加了一個轉換器,有點不同,然後是一個。它返回字符串和對象填充複選框列表和處理選定的選項(我在調試模式下看到的值),但然後我得到的信息「一個值是無效的」。 轉換爲字符串工作正常,但轉換爲對象時出錯。 – Zivko 2014-09-25 11:31:27

+0

公共對象的getAsObject(FacesContext的CTX,的UIComponent組件,字符串值){ \t嘗試{ \t \t如果(值!= NULL && value.trim()。長度()> 0){\t \t 列表列表= getBean(TestBean.class).getListRiskOutcomes(); \t爲(GeneralCollDTO項目:名單){ \t \t如果(value.equals(item.getValue())){ \t \t \t回報新GeneralCollDTO(item.getName(),值); \t \t} \t \t \t}} 回報 空; } catch(Exception e){ e.printStackTrace(); 返回null; } } – Zivko 2014-09-25 11:32:14

相關問題