This example demonstrates how to create dynamic DataTable with runtime column selection.
The view
src/main/webapp/index.xhtml<h:form>
<p:selectCheckboxMenu value="#{employeeBean.selectedColumns}"
label="Table Columns">
<f:selectItems value="#{employeeBean.columnMap.entrySet()}"
var="entry"
itemValue="#{entry.key}"
itemLabel="#{entry.value}"/>
<p:ajax event="change" update="table"/>
</p:selectCheckboxMenu>
<br/>
<p:dataTable id="table" var="emp" value="#{employeeBean.employeeList}">
<p:columns value="#{employeeBean.selectedColumns}" var="colKey">
<f:facet name="header">
<h:outputText value="#{employeeBean.columnMap[colKey]}"/>
</f:facet>
<h:outputText value="#{emp[colKey]}"/>
</p:columns>
</p:dataTable>
</h:form>
The managed bean
@ManagedBean
@ViewScoped
public class EmployeeBean {
private List<String> selectedColumns = new ArrayList<>();
private List<Employee> employeeList = new ArrayList<>();
private Map<String, String> columnMap = new LinkedHashMap<>();
@PostConstruct
private void postConstruct() {
initColumnProperties();
initEmployeeList();
}
private void initColumnProperties() {
addColumn("id", "ID");
addColumn("name", "Name");
addColumn("phoneNumber", "Phone Number");
addColumn("address", "Address");
selectedColumns.addAll(columnMap.keySet());
}
private void addColumn(String propertyName, String displayName) {
columnMap.put(propertyName, displayName);
}
private void initEmployeeList() {
DataFactory dataFactory = new DataFactory();
for (int i = 1; i < 20; i++) {
Employee employee = new Employee();
employee.setId(i);
employee.setName(dataFactory.getName());
employee.setPhoneNumber(String.format("%s-%s-%s", dataFactory.getNumberText(3),
dataFactory.getNumberText(3),
dataFactory.getNumberText(4)));
employee.setAddress(dataFactory.getAddress() + "," + dataFactory.getCity());
employeeList.add(employee);
}
}
public List<Employee> getEmployeeList() {
return employeeList;
}
public List<String> getSelectedColumns() {
return selectedColumns;
}
public void setSelectedColumns(List<String> selectedColumns) {
this.selectedColumns = selectedColumns;
}
public Map<String, String> getColumnMap() {
return columnMap;
}
}
public class Employee {
private long id;
private String name;
private String phoneNumber;
private String address;
.............
}
To try examples, run embedded tomcat (configured in pom.xml of example project below):
mvn tomcat7:run-war
Output
Example ProjectDependencies and Technologies Used: - primefaces 6.1 primefaces
- jsf-api 2.2.14:
This is the master POM file for Oracle's Implementation of the JSF 2.2 Specification.
- jsf-impl 2.2.14:
This is the master POM file for Oracle's Implementation of the JSF 2.2 Specification.
- datafactory 0.8: Library to generate data for testing.
- JDK 1.8
- Maven 3.3.9
|