Managed Bean
package com.algaworks.erp.controller;
import java.io.Serializable;
import java.util.List;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import com.algaworks.erp.model.Categoria;
import com.algaworks.erp.repository.Categorias;
@Named
@ViewScoped
public class ConsultaCategoriaBean implements Serializable {
private static final long serialVersionUID = 1L;
@Inject private Categorias categorias;
/**
* interface do primefaces
* 1º nível de nó
* treenode que não aparece na arvore, é um no invisivel
*/
private TreeNode raiz;
public void consultar(){
List<Categoria> categoriasRaizes = categorias.raizes();
this.raiz = new DefaultTreeNode("Raiz", null);
adicionarNos(categoriasRaizes,this.raiz);
}
private void adicionarNos(List<Categoria> categorias, TreeNode pai){
/**
* Iterando na lista e adicionar
*/
for(Categoria categoria : categorias){
/**Instanciando um novo nó
* passando o valor(categoria), pai
* no - pai - categoria atual
*/
TreeNode no = new DefaultTreeNode(categorias, pai);
//raiz.getChildren().add(no);
/**chamar adicionandoNos recursivamente passsando o valor(categoria.getSubcategorias(), pai(no))
* para carregar subcategorias para a categoria atual (no)
* Consulta lazy para subCategorias
*/
adicionarNos(categoria.getSubcategorias(), no);
}
}
public TreeNode getRaiz() {
return raiz;
}![inserir a descrição da imagem aqui][1]
}
Facelet
<!DOCTYPE html>
<!-- DEFINICAO DO TEMPLATE A SER UTILIZADO E IMPORTACAO DAS NAMESPACES-->
<ui:composition template="/WEB-INF/templates/Layout.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui" >
<!-- ação que sera chamada toda vez que a view for carregada -->
<f:metadata>
<f:viewAction action="#{consultaCategoriaBean.consultar}" />
</f:metadata>
O que for escrito fora do dine nao sera exibido
<!-- DEFINICAO DO CORPO -->
<ui:define name="corpo">
<h1>Componente Tree Primefaces</h1>
<h:form id="frmCategorias">
<p:tree value="#{consultaCategoriaBean.raiz}"
var="cat"
dynamic="true"
style="width:700px; height:400px">
<p:treeNode>
<h:outputText value="#{cat}" />
</p:treeNode>
</p:tree>
</h:form>
</ui:define>
</ui:composition>