2011-12-13 70 views
1

我需要您的帮助。我使用的是JSF 2.0,我有一个数据表组件。数据表中的一列是动作列,我需要创建一个包含不同类型的动作源组件的工具栏,如命令按钮,链接等。动作源的类型在运行时确定,动作源的数量也在运行。我怎么能在JSF 2.0实现这个JSF中的动态列Datatable JSF2.0

  <p:dataTable value="#{listBranchBean1.rowDataModel}" var="rowItem" 
       id="myId" paginator="true" 
       paginatorTemplate="{FirstPageLink}{PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}{RowsPerPageDropdown} " 
       rowsPerPageTemplate="10,5,2" previousPageLinkLabel="&lt;" 
       nextPageLinkLabel="&gt;" widgetVar="branchTable" 
       selection="#{listBranchBean1.selectedBranchesPrime}" 
       resizableColumns="true" 
       sortBy="#{rowItem.columnsValueMap['branchId'].value}"> 
       <f:facet name="header"> 
       <p:outputPanel> 
        <h:outputText value="Search all fields:" /> 
        <p:inputText id="globalFilter" onkeyup="branchTable.filter()" 
         style="width:150px" /> 
       </p:outputPanel> 
       </f:facet> 
       <p:column selectionMode="multiple" style="text-align:left"> 
       <f:facet name="header"> 
        <h:outputText value="Select" /> 
       </f:facet> 
       <h:outputText value="#{rowItem.uniqueId}" /> 
       </p:column> 
       <p:column 
       rendered="#{listBranchBean1.columnsMap['objectId'].hidden==false}" 
       sortBy="#{rowItem.columnsValueMap['objectId'].value}" 
       filterBy="#{rowItem.columnsValueMap['objectId'].value}"> 
       <f:facet name="header"> 
        <h:outputText 
         value="#{listBranchBean1.columnsMap['objectId'].displayLabel}" /> 
       </f:facet> 
       <h:outputText 
        value="#{rowItem.columnsValueMap['objectId'].value}" /> 
       </p:column> 
       <p:column 
       rendered="#{listBranchBean1.columnsMap['actions'].hidden==false}"> 
       <f:facet name="header"> 
        <h:outputText 
         value="#{listBranchBean1.columnsMap['actions'].displayLabel}" /> 
       </f:facet> 
       <p:toolbar> 
        <p:toolbarGroup> 
         <ui:repeat var="action" 
          value="#{rowItem.columnsValueMap['actions'].value}"> 
          <p:commandButton title="#{action}" type="button"> 
          </p:commandButton> 
         </ui:repeat> 
        </p:toolbarGroup> 

       </p:toolbar> 
       </p:column> 
      </p:dataTable> 

我要替换的东西最后一列类似

    <p:toolbar binding="#{listBranchBean1.getActions(rowItem)}"> 
       </p:toolbar> 

我感谢你的帮助

Prajeesh奈尔

回答

2

是有区别的JSF中的构建时间和呈现时间。像<ui:repeat>这样的构建时标签可以动态创建新组件,但它们只能使用构建时可用的数据。

但是,使用Java,您也允许以编程方式更改组件树,但这也不能随时发生。安全的时刻是preRenderViewEvent,它比构建时刻(restore view阶段晚)晚一点,你应该拥有你需要的所有数据。

在此事件的事件处理函数内,您可以引用您绑定到支持bean的工具栏,并以编程方式向其添加列。

例子可见:

请注意,如果您的支持bean是@ViewScoped,你最好不要使用绑定,但使用手动查找来代替。这是由于JSF中的视图范围和绑定组件存在一些错误。

+0

1.范围可以由最终用户来定义上创建动态列,因为它是一个定制的解决方案。截至目前,它是一个ViewScope。如果你看到可能是最后一列,则rowItem是可变数据var。所以我需要获取特定于该行的操作列。每行都会有所不同 –

+1

如果您需要动态列,请使用arjan的解决方案。如果您还需要每行动态内容,请放入多个组件并有条件地呈现它们。数据表中的每行不能有任意的组件,因为行并不真正存在(它是使用不断变化的数据呈现的列)。如果你需要,可以看看一些datagrid组件。 –

0

下面的代码将选定的国家的基础

public void loadDynamicList() throws Exception { 
int i=0; 
dynamicList = new ArrayList<List<String>>(); 
dynamicList.add(Arrays.asList(new String[] { "ID1" })); 
existingCountryList = new ArrayList<Country>(); 
String countryCode="US"; 
existingCountryList.add(getCountryService().getCountryByCode(countryCode)); 
Country country=getCountryService().getCountryByCode(countryCode); 
countryLanguageSet=country.getCountryLanguage(); 
i=country.getCountryLanguage().size(); 
dynamicHeaders = new String[i] ; 
int j=0; 
    for (CountryLanguage count: countryLanguageSet) { 
    System.out.println(count.getLanguage().getLanguageName()); 
    dynamicHeaders[j]=count.getLanguage().getLanguageName(); 
    j++; 
} 
} 
public void populateDynamicDataTable() { 
debugLogger.debug("populateDynamicDataTable:Enter"); 
// Create <h:dataTable value="#{myBean.dynamicList}" var="dynamicItem">. 
HtmlDataTable dynamicDataTable = new HtmlDataTable(); 
dynamicDataTable.setValueExpression("value", createValueExpression("#{relationBean.dynamicList}", List.class)); 
dynamicDataTable.setVar("dynamicItem"); 

// Iterate over columns. 
for (int i = 0; i < dynamicHeaders.length; i++) { 
    // Create <h:column>. 
    HtmlColumn column = new HtmlColumn(); 
    dynamicDataTable.getChildren().add(column); 
    // Create <h:outputText value="dynamicHeaders[i]"> for <f:facet name="header"> of column. 
    HtmlOutputText header = new HtmlOutputText(); 
    header.setValue(dynamicHeaders[i]); 
    column.setHeader(header); 
    HtmlInputText input=new HtmlInputText(); 
    column.getChildren().add(input); 
} 
    dynamicDataTableGroup = new HtmlPanelGroup(); 
dynamicDataTableGroup.getChildren().add(dynamicDataTable); 
debugLogger.debug("populateDynamicDataTable:Exit"); 
} 

public HtmlPanelGroup getDynamicDataTableGroup() throws Exception { 
// This will be called once in the first RESTORE VIEW phase. 
if (dynamicDataTableGroup == null) { 
    loadDynamicList(); // Preload dynamic list. 
    populateDynamicDataTable(); // Populate editable datatable. 
} 

return dynamicDataTableGroup; 
} 


public List<List<String>> getDynamicList() { 
return dynamicList; 
} 
public void setDynamicList(List<List<String>> dynamicList) { 
this.dynamicList = dynamicList; 
} 

public void setDynamicDataTableGroup(HtmlPanelGroup dynamicDataTableGroup) { 
this.dynamicDataTableGroup = dynamicDataTableGroup; 
} 

public ValueExpression createValueExpression(String valueExpression, Class<?> valueType) { 
FacesContext facesContext = FacesContext.getCurrentInstance(); 
return facesContext.getApplication().getExpressionFactory().createValueExpression(
    facesContext.getELContext(), valueExpression, valueType); 
}