Columns of TreeTable can be created dynamically using the p:columns component.
Documentation<style type="text/css"> .ui-treetable table { table-layout: fixed } </style> <h:form id="form"> <h:panelGrid columns="3" style="margin:10px 0"> <p:outputLabel for="template" value="Template:" style="font-weight:bold"/> <p:inputText id="template" value="#{ttColumnsView.columnTemplate}" size="50"/> <p:commandButton update="tt" action="#{ttColumnsView.createDynamicColumns}" value="Update" process="@parent" icon="pi pi-refresh" /> </h:panelGrid> <p:treeTable id="tt" value="#{ttColumnsView.root}" var="document"> <f:facet name="header"> Document Viewer </f:facet> <p:columns value="#{ttColumnsView.columns}" var="column" headerText="#{column.header}"> <h:outputText value="#{document[column.property]}" /> </p:columns> </p:treeTable> </h:form>
@Named("ttColumnsView") @ViewScoped public class ColumnsView implements Serializable { private final static List<String> VALID_COLUMN_KEYS = Arrays.asList("name", "size", "type"); private String columnTemplate = "name size type"; private List<ColumnModel> columns; private TreeNode root; @Inject private DocumentService service; @PostConstruct public void init() { root = service.createDocuments(); createDynamicColumns(); } public TreeNode getRoot() { return root; } public void setService(DocumentService service) { this.service = service; } public void createDynamicColumns() { String[] columnKeys = columnTemplate.split(" "); columns = new ArrayList<ColumnModel>(); for(String columnKey : columnKeys) { String key = columnKey.trim(); if(VALID_COLUMN_KEYS.contains(key)) { columns.add(new ColumnModel(columnKey.toUpperCase(), columnKey)); } } } public String getColumnTemplate() { return columnTemplate; } public void setColumnTemplate(String columnTemplate) { this.columnTemplate = columnTemplate; } public List<ColumnModel> getColumns() { return columns; } static public class ColumnModel implements Serializable { private String header; private String property; public ColumnModel(String header, String property) { this.header = header; this.property = property; } public String getHeader() { return header; } public String getProperty() { return property; } } }
@Named @ApplicationScoped public class DocumentService { public TreeNode createDocuments() { TreeNode root = new DefaultTreeNode(new Document("Files", "-", "Folder"), null); TreeNode documents = new DefaultTreeNode(new Document("Documents", "-", "Folder"), root); TreeNode pictures = new DefaultTreeNode(new Document("Pictures", "-", "Folder"), root); TreeNode movies = new DefaultTreeNode(new Document("Movies", "-", "Folder"), root); TreeNode work = new DefaultTreeNode(new Document("Work", "-", "Folder"), documents); TreeNode primefaces = new DefaultTreeNode(new Document("PrimeFaces", "-", "Folder"), documents); //Documents TreeNode expenses = new DefaultTreeNode("document", new Document("Expenses.doc", "30 KB", "Word Document"), work); TreeNode resume = new DefaultTreeNode("document", new Document("Resume.doc", "10 KB", "Word Document"), work); TreeNode refdoc = new DefaultTreeNode("document", new Document("RefDoc.pages", "40 KB", "Pages Document"), primefaces); //Pictures TreeNode barca = new DefaultTreeNode("picture", new Document("barcelona.jpg", "30 KB", "JPEG Image"), pictures); TreeNode primelogo = new DefaultTreeNode("picture", new Document("logo.jpg", "45 KB", "JPEG Image"), pictures); TreeNode optimus = new DefaultTreeNode("picture", new Document("optimusprime.png", "96 KB", "PNG Image"), pictures); //Movies TreeNode pacino = new DefaultTreeNode(new Document("Al Pacino", "-", "Folder"), movies); TreeNode deniro = new DefaultTreeNode(new Document("Robert De Niro", "-", "Folder"), movies); TreeNode scarface = new DefaultTreeNode("mp3", new Document("Scarface", "15 GB", "Movie File"), pacino); TreeNode carlitosWay = new DefaultTreeNode("mp3", new Document("Carlitos' Way", "24 GB", "Movie File"), pacino); TreeNode goodfellas = new DefaultTreeNode("mp3", new Document("Goodfellas", "23 GB", "Movie File"), deniro); TreeNode untouchables = new DefaultTreeNode("mp3", new Document("Untouchables", "17 GB", "Movie File"), deniro); return root; } public TreeNode createCheckboxDocuments() { TreeNode root = new CheckboxTreeNode(new Document("Files", "-", "Folder"), null); TreeNode documents = new CheckboxTreeNode(new Document("Documents", "-", "Folder"), root); TreeNode pictures = new CheckboxTreeNode(new Document("Pictures", "-", "Folder"), root); TreeNode movies = new CheckboxTreeNode(new Document("Movies", "-", "Folder"), root); TreeNode work = new CheckboxTreeNode(new Document("Work", "-", "Folder"), documents); TreeNode primefaces = new CheckboxTreeNode(new Document("PrimeFaces", "-", "Folder"), documents); //Documents TreeNode expenses = new CheckboxTreeNode("document", new Document("Expenses.doc", "30 KB", "Word Document"), work); TreeNode resume = new CheckboxTreeNode("document", new Document("Resume.doc", "10 KB", "Word Document"), work); TreeNode refdoc = new CheckboxTreeNode("document", new Document("RefDoc.pages", "40 KB", "Pages Document"), primefaces); //Pictures TreeNode barca = new CheckboxTreeNode("picture", new Document("barcelona.jpg", "30 KB", "JPEG Image"), pictures); TreeNode primelogo = new CheckboxTreeNode("picture", new Document("logo.jpg", "45 KB", "JPEG Image"), pictures); TreeNode optimus = new CheckboxTreeNode("picture", new Document("optimusprime.png", "96 KB", "PNG Image"), pictures); //Movies TreeNode pacino = new CheckboxTreeNode(new Document("Al Pacino", "-", "Folder"), movies); TreeNode deniro = new CheckboxTreeNode(new Document("Robert De Niro", "-", "Folder"), movies); TreeNode scarface = new CheckboxTreeNode("mp3", new Document("Scarface", "15 GB", "Movie File"), pacino); TreeNode carlitosWay = new CheckboxTreeNode("mp3", new Document("Carlitos' Way", "24 GB", "Movie File"), pacino); TreeNode goodfellas = new CheckboxTreeNode("mp3", new Document("Goodfellas", "23 GB", "Movie File"), deniro); TreeNode untouchables = new CheckboxTreeNode("mp3", new Document("Untouchables", "17 GB", "Movie File"), deniro); return root; } }