Para mostrar datos jerárquicos y crear navegación en el sitio, Primefaces te proporciona componentes Árbol y Tabla de Árbol. Aprovechar estos componentes no es tan fácil y requiere muchos detalles técnicos. Algunos de esos problemas técnicos están cubiertos aleatoriamente en documentos técnicos publicados en Internet, mientras que otros no lo están. Este tutorial tiene la intención de proporcionarte explicaciones completas de cómo puedes beneficiarte de estos componentes.
Información Básica sobre el Árbol de Primefaces
Info | Tree |
---|---|
Component Class | org.primefaces.component.tree.Tree |
Component Type | org.primefaces.component.Tree |
Component Family | org.primefaces.component |
Renderer Type | org.primefaces.component.TreeRenderer |
Renderer Class | org.primefaces.component.tree.TreeRenderer |
Atributos del Árbol de Primefaces
Name | Default | Type | Description |
---|---|---|---|
id | null | String | Unique identifier of the component |
rendered | true | Boolean | Boolean value to specify the rendering of the component, when set to false component will not be rendered |
binding | null | Object | An el expression that maps to a server side UIComponent instance in a backing bean |
widgetVar | null | String | Name of the client side widget |
value | null | Object | A TreeNode instance as the backing model |
var | null | String | Name of the request-scoped variable that’ll be usedto refer each treenode data. |
dynamic | false | Boolean | Specifies the ajax/client toggleMode |
cache | true | Boolean | Specifies caching on dynamically loaded nodes.When set to true expanded nodes will be kept in memory. |
onNodeClick | null | String | Javascript event to process when a tree node isclicked. |
selection | null | Object | TreeNode array to reference the selections. |
style | null | String | Style of the main container element of tree |
styleClass | null | String | Style class of the main container element of tree |
selectionMode | null | String | Defines the selectionMode |
highlight | true | Boolean | Highlights nodes on hover when selection is enabled. |
datakey | null | Object | Unique key of the data presented by nodes. |
animate | false | Boolean | When enabled, displays slide effect on toggle. |
orientation | vertical | String | Orientation of layout, vertical or horizontal. |
propagateSelectionUp | true | Boolean | Defines upwards selection propagation forcheckbox mode. |
propagateSelectionDown | true | Boolean | Defines downwards selection propagation forcheckbox mode. |
dir | ltr | String | Defines text direction, valid values are ltr and rtl. |
draggable | false | Boolean | Makes tree nodes draggable. |
droppable | false | Boolean | Makes tree droppable. |
dragdropScope | null | String | Scope key to group a set of tree components fortransferring nodes using drag and drop. |
dragMode | self | String | Defines parent-child relationship when a node isdragged, valid values are self (default), parent andancestor. |
dropRestrict | none | String | Defines parent-child restrictions when a node isdropped valid values are none (default) and sibling. |
required | false | Boolean | Validation constraint for selection. |
requiredMessage | null | String | Message for required selection validation. |
Empezando con el Árbol de Primefaces
El árbol se rellena con una instancia de org.primefaces.model.TreeNode que corresponde a la raíz. A continuación, se muestra un ejemplo simple en el que se utiliza un componente de árbol. Código index.xhtml:
<html xmlns="https://www.w3.org/1999/xhtml"
xmlns:ui="https://java.sun.com/jsf/facelets"
xmlns:h="https://java.sun.com/jsf/html"
xmlns:f="https://java.sun.com/jsf/core"
xmlns:p="https://primefaces.org/ui">
<h:head>
<script name="jquery/jquery.js" library="primefaces"></script>
</h:head>
<h:form>
<p:tree value="#{treeManagedBean.root}" var="node">
<p:treeNode>
<h:outputText value="#{node}"/>
</p:treeNode>
</p:tree>
</h:form>
</html>
package com.journaldev.prime.faces.beans;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
@ManagedBean
@SessionScoped
public class TreeManagedBean {
// Instancia de TreeNode
private TreeNode root;
public TreeManagedBean(){
// Este es el nodo raíz, por lo que sus datos son raíz y su padre es nulo
this.root = new DefaultTreeNode("Root Node", null);
// Crear nodo hijo
TreeNode child = new DefaultTreeNode("Child Node", this.root);
// Referenciar el padre del nodo hijo
child.setParent(this.root);
// Crear nodos descendientes
TreeNode descendent = new DefaultTreeNode("Descendent Node", child);
// Referenciar el padre del nodo descendiente
descendent.setParent(child);
}
public TreeNode getRoot() {
return root;
}
public void setRoot(TreeNode root) {
this.root = root;
}
}
Aquí hay explicaciones adicionales además de las comentadas anteriormente:
- El componente Tree está asociado con una instancia de TreeNode llamada raíz.
- La instancia Raíz también tiene un hijo como una instancia de TreeNode que también hace referencia a su hijo.
- Esta vista jerárquica se muestra haciendo referencia directamente al nodo raíz usando el atributo valor.
- El atributo var ha sido utilizado por el componente Tree para hacer referencia a la variable de ámbito de solicitud que se utilizará para referir los datos de cada nodo de árbol.
- Cada TreeNode ha sido creado pasando dos argumentos; instancia de objeto de datos encapsulados y referencia al padre.
- Las propiedades de cada TreeNode son: tipo, datos, hijos, padre e indicador booleano expandido. Todas esas propiedades deben explorarse en las próximas secciones.
Árbol Dinámico Primefaces
El componente de árbol no es dinámico por defecto; el modo dinámico utiliza ajax para obtener los nodos del árbol desde el servidor según la demanda. Cuando un nodo se expande, el árbol carga los hijos del nodo expandido en particular y los envía al cliente para su visualización. A diferencia de lo que sucedía originalmente, cuando la conmutación está configurada en el cliente, todos los nodos del árbol en el modelo se representan en el cliente y se crea el árbol. Para conjuntos de datos a gran escala, el modo dinámico es más adecuado que el comportamiento predeterminado. A continuación, se muestra la forma en que se puede identificar el atributo dinámico. Código index.xhtml:
<html xmlns="https://www.w3.org/1999/xhtml"
xmlns:ui="https://java.sun.com/jsf/facelets"
xmlns:h="https://java.sun.com/jsf/html"
xmlns:f="https://java.sun.com/jsf/core"
xmlns:p="https://primefaces.org/ui">
<h:head>
<script name="jquery/jquery.js" library="primefaces"></script>
</h:head>
<h:form>
<p:tree value="#{treeManagedBean.root}" var="node" dynamic="true">
<p:treeNode>
<h:outputText value="#{node}"/>
</p:treeNode>
</p:tree>
</h:form>
</html>
Tipos de nodos de árbol múltiples de Primefaces
Es un requisito común querer diferentes tipos e iconos de TreeNode dentro de su jerarquía. Para implementar esto, debe seguir los siguientes pasos simples:
- Defina/coloque más de un componente <p:treeNode/>, cada uno con un tipo diferente.
- Use ese tipo definido para vincular TreeNodes en su modelo.
A continuación, se muestra un ejemplo simple de demostración para usar diferentes TreeNodes y mostrar variedades de tipos. Los archivos afectados son tanto el archivo de vista index.xhtml como TreeManagedBean.java. Código index.xhtml:
<html xmlns="https://www.w3.org/1999/xhtml"
xmlns:ui="https://java.sun.com/jsf/facelets"
xmlns:h="https://java.sun.com/jsf/html"
xmlns:f="https://java.sun.com/jsf/core"
xmlns:p="https://primefaces.org/ui">
<h:head>
<script name="jquery/jquery.js" library="primefaces"></script>
</h:head>
<h:form>
<p:tree value="#{treeManagedBean.root}" var="node" dynamic="true">
<p:treeNode expandedIcon="ui-icon ui-icon-folder-open"
collapsedIcon="ui-icon ui-icon-folder-collapsed">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="document" icon="ui-icon ui-icon-document">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="image" icon="ui-icon ui-icon-image">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="video" icon="ui-icon ui-icon-video">
<h:outputText value="#{node}"/>
</p:treeNode>
</p:tree>
</h:form>
</html>
package com.journaldev.prime.faces.beans;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
@ManagedBean
@SessionScoped
public class TreeManagedBean {
// Instancia de TreeNode
private TreeNode root;
public TreeManagedBean(){
// Este es el nodo raíz, por lo que sus datos son raíz y su padre es nulo
this.root = new DefaultTreeNode("Root Node", null);
// Crear nodo de documentos
TreeNode documents = new DefaultTreeNode("Documents", this.root);
// Crear nodo de documento
TreeNode document01 = new DefaultTreeNode("document","Expenses.doc", documents);
// Crear nodo de imágenes
TreeNode images = new DefaultTreeNode("Images", this.root);
// Crear nodo de imagen
TreeNode image01 = new DefaultTreeNode("image","Travel.gif", images);
// Crear nodo de videos
TreeNode videos = new DefaultTreeNode("Videos", this.root);
// Crear nodo de video
TreeNode video01 = new DefaultTreeNode("video","Play.avi", videos);
}
public TreeNode getRoot() {
return root;
}
public void setRoot(TreeNode root) {
this.root = root;
}
}
Como es obvio a partir de la demostración proporcionada, la integración entre la instancia de TreeNode y el componente p:treeNode es el atributo type.
Eventos de Comportamiento Ajax del Árbol Primefaces
El árbol proporciona varios eventos de comportamiento ajax:
Event | Listener Parameter | Fired |
---|---|---|
expand | org.primefaces.event.NodeExpandEvent | When a node is expanded. |
collapse | org.primefaces.event.NodeCollapseEvent | When a node is collapsed. |
select | org.primefaces.event.NodeSelectEvent | When a node is selected. |
unselect | org.primefaces.event.NodeUnselectEvent | When a node is unselected. |
El siguiente árbol tiene tres escuchas: Código index2.xhtml:
<html xmlns="https://www.w3.org/1999/xhtml"
xmlns:ui="https://java.sun.com/jsf/facelets"
xmlns:h="https://java.sun.com/jsf/html"
xmlns:f="https://java.sun.com/jsf/core"
xmlns:p="https://primefaces.org/ui">
<h:head>
<script name="jquery/jquery.js" library="primefaces"></script>
</h:head>
<h:form>
<p:tree value="#{treeManagedBean.root}" var="node" dynamic="true">
<p:treeNode expandedIcon="ui-icon ui-icon-folder-open"
collapsedIcon="ui-icon ui-icon-folder-collapsed">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="document" icon="ui-icon ui-icon-document">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="image" icon="ui-icon ui-icon-image">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="video" icon="ui-icon ui-icon-video">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:ajax event="select" listener="#{treeManagedBean.onNodeSelect}"></p:ajax>
<p:ajax event="unselect" listener="#{treeManagedBean.onNodeUnSelect}"></p:ajax>
<p:ajax event="expand" listener="#{treeManagedBean.onNodeExpand}"></p:ajax>
<p:ajax event="collapse" listener="#{treeManagedBean.onNodeCollapse}"></p:ajax>
</p:tree>
</h:form>
</html>
package com.journaldev.prime.faces.beans;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.primefaces.event.NodeCollapseEvent;
import org.primefaces.event.NodeExpandEvent;
import org.primefaces.event.NodeSelectEvent;
import org.primefaces.event.NodeUnselectEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
@ManagedBean
@SessionScoped
public class TreeManagedBean {
// Instancia de TreeNode
private TreeNode root;
public TreeManagedBean(){
// Este es el nodo raíz, por lo que sus datos son raíz y su padre es nulo
this.root = new DefaultTreeNode("Root Node", null);
// Crear nodo de documentos
TreeNode documents = new DefaultTreeNode("Documents", this.root);
// Crear nodo de documento
TreeNode document01 = new DefaultTreeNode("document","Expenses.doc", documents);
// Crear nodo de imágenes
TreeNode images = new DefaultTreeNode("Images", this.root);
// Crear nodo de imagen
TreeNode image01 = new DefaultTreeNode("image","Travel.gif", images);
// Crear nodo de videos
TreeNode videos = new DefaultTreeNode("Videos", this.root);
// Crear nodo de video
TreeNode video01 = new DefaultTreeNode("video","Play.avi", videos);
}
public TreeNode getRoot() {
return root;
}
public void setRoot(TreeNode root) {
this.root = root;
}
public void onNodeSelect(NodeSelectEvent event){
System.out.println("Node Data ::"+event.getTreeNode().getData()+" :: Selected");
}
public void onNodeUnSelect(NodeUnselectEvent event){
System.out.println("Node Data ::"+event.getTreeNode().getData()+" :: UnSelected");
}
public void onNodeExpand(NodeExpandEvent event){
System.out.println("Node Data ::"+event.getTreeNode().getData()+" :: Expanded");
}
public void onNodeCollapse(NodeCollapseEvent event){
System.out.println("Node Data ::"+event.getTreeNode().getData()+" :: Collapsed");
}
}
- Una vez que hayas expandido TreeNode, se ha disparado un evento Ajax.
- Para cada evento disparado, se ha definido un método de escucha de ajax para fines de manejo.
- Los escuchadores de eventos también son útiles cuando se trata de una gran cantidad de datos. Es decir, proporcionando los nodos raíz e hijo al árbol, utilizar escuchadores de eventos para obtener el nodo seleccionado y agregar nuevos nodos a ese árbol particular en tiempo de ejecución.
- Los eventos de Seleccionar y Deseleccionar no se han producido ahora, emitir estos eventos requiere que se establezca SelectionMode.
Selección y Modo de Selección de Primefaces Tree
El componente Tree proporciona una funcionalidad incorporada que te ayuda a identificar aquellos nodos seleccionados. El mecanismo de selección de nodos admite tres modos, para cada modo proporcionado se ha asignado una instancia o instancias de TreeNode como referencia de selección.
- Modo Único: Se puede seleccionar un TreeNode a la vez. La selección debe ser una referencia de TreeNode.
- Modo Múltiple: Se pueden seleccionar varios nodos. La selección debe ser una referencia de matriz de TreeNode.
- Modo de Casilla de Verificación: Se pueden seleccionar varios nodos utilizando una interfaz de casilla de verificación. La selección debe ser una referencia de matriz de TreeNode.
Código index1.xhtml:
<html xmlns="https://www.w3.org/1999/xhtml"
xmlns:ui="https://java.sun.com/jsf/facelets"
xmlns:h="https://java.sun.com/jsf/html"
xmlns:f="https://java.sun.com/jsf/core"
xmlns:p="https://primefaces.org/ui">
<h:head>
<script name="jquery/jquery.js" library="primefaces"></script>
</h:head>
<h:form>
<p:tree value="#{treeManagedBean.root}" var="node" dynamic="true"
selectionMode="single" selection="#{treeManagedBean.singleSelectedTreeNode}">
<p:treeNode expandedIcon="ui-icon ui-icon-folder-open"
collapsedIcon="ui-icon ui-icon-folder-collapsed">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="document" icon="ui-icon ui-icon-document">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="image" icon="ui-icon ui-icon-image">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="video" icon="ui-icon ui-icon-video">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:ajax event="select" listener="#{treeManagedBean.onNodeSelect}"></p:ajax>
<p:ajax event="unselect" listener="#{treeManagedBean.onNodeUnSelect}"></p:ajax>
<p:ajax event="expand" listener="#{treeManagedBean.onNodeExpand}"></p:ajax>
<p:ajax event="collapse" listener="#{treeManagedBean.onNodeCollapse}"></p:ajax>
</p:tree>
<p:tree value="#{treeManagedBean.root}" var="node" dynamic="true"
selectionMode="multiple" selection="#{treeManagedBean.multipleSelectedTreeNodes}">
<p:treeNode expandedIcon="ui-icon ui-icon-folder-open"
collapsedIcon="ui-icon ui-icon-folder-collapsed">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="document" icon="ui-icon ui-icon-document">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="image" icon="ui-icon ui-icon-image">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="video" icon="ui-icon ui-icon-video">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:ajax event="select" listener="#{treeManagedBean.onNodeSelect}"></p:ajax>
<p:ajax event="unselect" listener="#{treeManagedBean.onNodeUnSelect}"></p:ajax>
<p:ajax event="expand" listener="#{treeManagedBean.onNodeExpand}"></p:ajax>
<p:ajax event="collapse" listener="#{treeManagedBean.onNodeCollapse}"></p:ajax>
</p:tree>
<p:tree value="#{treeManagedBean.root}" var="node" dynamic="true"
selectionMode="checkbox" selection="#{treeManagedBean.checkboxSelectedTreeNodes}">
<p:treeNode expandedIcon="ui-icon ui-icon-folder-open"
collapsedIcon="ui-icon ui-icon-folder-collapsed">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="document" icon="ui-icon ui-icon-document">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="image" icon="ui-icon ui-icon-image">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="video" icon="ui-icon ui-icon-video">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:ajax event="select" listener="#{treeManagedBean.onNodeSelect}"></p:ajax>
<p:ajax event="unselect" listener="#{treeManagedBean.onNodeUnSelect}"></p:ajax>
<p:ajax event="expand" listener="#{treeManagedBean.onNodeExpand}"></p:ajax>
<p:ajax event="collapse" listener="#{treeManagedBean.onNodeCollapse}"></p:ajax>
</p:tree>
<h:commandButton value="Print Selected Nodes" action="#{treeManagedBean.printSelectedNodes}"></h:commandButton>
</h:form>
</html>
package com.journaldev.prime.faces.beans;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.primefaces.event.NodeCollapseEvent;
import org.primefaces.event.NodeExpandEvent;
import org.primefaces.event.NodeSelectEvent;
import org.primefaces.event.NodeUnselectEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
@ManagedBean
@SessionScoped
public class TreeManagedBean {
// Instancia TreeNode
private TreeNode root;
private TreeNode singleSelectedTreeNode;
private TreeNode [] multipleSelectedTreeNodes;
private TreeNode [] checkboxSelectedTreeNodes;
public TreeManagedBean(){
// Este es el nodo raíz, por lo que su dato es raíz y su padre es nulo
this.root = new DefaultTreeNode("Root Node", null);
// Crear nodo de documentos
TreeNode documents = new DefaultTreeNode("Documents", this.root);
// Crear nodo de documento
TreeNode document01 = new DefaultTreeNode("document","Expenses.doc", documents);
// Crear nodo de imágenes
TreeNode images = new DefaultTreeNode("Images", this.root);
// Crear nodo de imagen
TreeNode image01 = new DefaultTreeNode("image","Travel.gif", images);
// Crear nodo de vídeos
TreeNode videos = new DefaultTreeNode("Videos", this.root);
// Crear nodo de vídeo
TreeNode video01 = new DefaultTreeNode("video","Play.avi", videos);
}
public TreeNode getRoot() {
return root;
}
public void setRoot(TreeNode root) {
this.root = root;
}
public TreeNode getSingleSelectedTreeNode() {
return singleSelectedTreeNode;
}
public void setSingleSelectedTreeNode(TreeNode singleSelectedTreeNode) {
this.singleSelectedTreeNode = singleSelectedTreeNode;
}
public TreeNode[] getMultipleSelectedTreeNodes() {
return multipleSelectedTreeNodes;
}
public void setMultipleSelectedTreeNodes(TreeNode[] multipleSelectedTreeNodes) {
this.multipleSelectedTreeNodes = multipleSelectedTreeNodes;
}
public TreeNode[] getCheckboxSelectedTreeNodes() {
return checkboxSelectedTreeNodes;
}
public void setCheckboxSelectedTreeNodes(TreeNode[] checkboxSelectedTreeNodes) {
this.checkboxSelectedTreeNodes = checkboxSelectedTreeNodes;
}
public void onNodeSelect(NodeSelectEvent event){
System.out.println("Node Data ::"+event.getTreeNode().getData()+" :: Selected");
}
public void onNodeUnSelect(NodeUnselectEvent event){
System.out.println("Node Data ::"+event.getTreeNode().getData()+" :: UnSelected");
}
public void onNodeExpand(NodeExpandEvent event){
System.out.println("Node Data ::"+event.getTreeNode().getData()+" :: Expanded");
}
public void onNodeCollapse(NodeCollapseEvent event){
System.out.println("Node Data ::"+event.getTreeNode().getData()+" :: Collapsed");
}
public String printSelectedNodes(){
System.out.println("Single Selection Is :: "+this.singleSelectedTreeNode.getData());
for(TreeNode n : this.multipleSelectedTreeNodes){
System.out.println("Multiple Selection Are :: "+n.getData());
}
for(TreeNode n : this.checkboxSelectedTreeNodes){
System.out.println("CheckBox Selection Are :: "+n.getData());
}
return "";
}
}
Se debe mencionar una nota restante para una explicación detallada completa:
- El componente TreeNode tiene atributos como expandedIcon y collapsedIcon para especificar los iconos de los comportamientos de expansión y colapso.
- El componente TreeNode también tiene el atributo icon que se utiliza para especificar el icono del propio nodo.
Caché de Nodo de Primefaces y OnNodeClick
Por defecto, el atributo cache está activado. Los nodos cargados dinámicamente se mantendrán en memoria, por lo que volver a expandir un nodo no provocará una solicitud al servidor. En caso de que lo hayas establecido como falso, contraer el nodo eliminará los hijos y expandirlo más tarde hará que los nodos hijos se recuperen nuevamente desde el servidor. También es aplicable ejecutar un JavaScript personalizado en caso de que se haya hecho clic en un nodo específico. El atributo onNodeClick se utiliza para este propósito, el método JavaScript se invoca pasando el nodo y los elementos de evento clickeados. El siguiente ejemplo muestra mensajes de registro que se muestran una vez que se ha llamado a onNodeClick. Código index3.xhtml:
<html xmlns="https://www.w3.org/1999/xhtml"
xmlns:ui="https://java.sun.com/jsf/facelets"
xmlns:h="https://java.sun.com/jsf/html"
xmlns:f="https://java.sun.com/jsf/core"
xmlns:p="https://primefaces.org/ui">
<h:head>
<script name="jquery/jquery.js" library="primefaces"></script>
<script>
function onNodeClick(node,event){
console.log("nodeArg :: "+node);
console.log("eventArg ::"+event);
}
</script>
</h:head>
<h:form>
<p:tree value="#{treeManagedBean.root}" var="node" dynamic="true"
onNodeClick="onNodeClick(node,event)"
selectionMode="single" selection="#{treeManagedBean.singleSelectedTreeNode}">
<p:treeNode expandedIcon="ui-icon ui-icon-folder-open"
collapsedIcon="ui-icon ui-icon-folder-collapsed">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="document" icon="ui-icon ui-icon-document">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="image" icon="ui-icon ui-icon-image">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="video" icon="ui-icon ui-icon-video">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:ajax event="select" listener="#{treeManagedBean.onNodeSelect}"></p:ajax>
<p:ajax event="unselect" listener="#{treeManagedBean.onNodeUnSelect}"></p:ajax>
<p:ajax event="expand" listener="#{treeManagedBean.onNodeExpand}"></p:ajax>
<p:ajax event="collapse" listener="#{treeManagedBean.onNodeCollapse}"></p:ajax>
</p:tree>
</h:form>
</html>
Primefaces DragDrop
Los nodos del árbol se pueden reordenar dentro de un solo árbol e incluso transferirse entre varios árboles mediante arrastrar y soltar. El siguiente ejemplo te muestra cómo hacer que un solo árbol sea arrastrable y soltarlo. Código index4.xhtml:
<html xmlns="https://www.w3.org/1999/xhtml"
xmlns:ui="https://java.sun.com/jsf/facelets"
xmlns:h="https://java.sun.com/jsf/html"
xmlns:f="https://java.sun.com/jsf/core"
xmlns:p="https://primefaces.org/ui">
<h:head>
<script name="jquery/jquery.js" library="primefaces"></script>
</h:head>
<h:form>
<p:tree value="#{treeManagedBean.root}" var="node" dynamic="true" droppable="true" draggable="true"
selectionMode="single" selection="#{treeManagedBean.singleSelectedTreeNode}">
<p:treeNode expandedIcon="ui-icon ui-icon-folder-open"
collapsedIcon="ui-icon ui-icon-folder-collapsed">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="document" icon="ui-icon ui-icon-document">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="image" icon="ui-icon ui-icon-image">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="video" icon="ui-icon ui-icon-video">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:ajax event="select" listener="#{treeManagedBean.onNodeSelect}"></p:ajax>
<p:ajax event="unselect" listener="#{treeManagedBean.onNodeUnSelect}"></p:ajax>
<p:ajax event="expand" listener="#{treeManagedBean.onNodeExpand}"></p:ajax>
<p:ajax event="collapse" listener="#{treeManagedBean.onNodeCollapse}"></p:ajax>
</p:tree>
</h:form>
</html>
Aplicar el concepto de arrastrar y soltar contra un solo árbol es muy fácil, un ejemplo más complicado se puede notar cuando se trata de arrastrar y soltar contra múltiples componentes de árbol. El siguiente ejemplo te muestra un ejemplo simple de eso. Esta vez, se debe utilizar un nuevo atributo dragdropScope para hacer que los nodos de los árboles sean arrastrables y soltables entre sí. Código index5.xhtml:
<html xmlns="https://www.w3.org/1999/xhtml"
xmlns:ui="https://java.sun.com/jsf/facelets"
xmlns:h="https://java.sun.com/jsf/html"
xmlns:f="https://java.sun.com/jsf/core"
xmlns:p="https://primefaces.org/ui">
<h:head>
<script name="jquery/jquery.js" library="primefaces"></script>
</h:head>
<h:form>
<p:tree value="#{treeManagedBean.root}" var="node" dynamic="true" droppable="true" draggable="true"
selectionMode="single" selection="#{treeManagedBean.singleSelectedTreeNode}"
dragdropScope="myScope">
<p:treeNode expandedIcon="ui-icon ui-icon-folder-open"
collapsedIcon="ui-icon ui-icon-folder-collapsed">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="document" icon="ui-icon ui-icon-document">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="image" icon="ui-icon ui-icon-image">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="video" icon="ui-icon ui-icon-video">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:ajax event="select" listener="#{treeManagedBean.onNodeSelect}"></p:ajax>
<p:ajax event="unselect" listener="#{treeManagedBean.onNodeUnSelect}"></p:ajax>
<p:ajax event="expand" listener="#{treeManagedBean.onNodeExpand}"></p:ajax>
<p:ajax event="collapse" listener="#{treeManagedBean.onNodeCollapse}"></p:ajax>
</p:tree>
<p:tree value="#{treeManagedBean.root}" var="node" dynamic="true" droppable="true" draggable="true"
selectionMode="single" selection="#{treeManagedBean.singleSelectedTreeNode}"
dragdropScope="myScope">
<p:treeNode expandedIcon="ui-icon ui-icon-folder-open"
collapsedIcon="ui-icon ui-icon-folder-collapsed">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="document" icon="ui-icon ui-icon-document">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="image" icon="ui-icon ui-icon-image">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="video" icon="ui-icon ui-icon-video">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:ajax event="select" listener="#{treeManagedBean.onNodeSelect}"></p:ajax>
<p:ajax event="unselect" listener="#{treeManagedBean.onNodeUnSelect}"></p:ajax>
<p:ajax event="expand" listener="#{treeManagedBean.onNodeExpand}"></p:ajax>
<p:ajax event="collapse" listener="#{treeManagedBean.onNodeCollapse}"></p:ajax>
</p:tree>
</h:form>
</html>
Árbol horizontal de PrimeFaces
<html xmlns="https://www.w3.org/1999/xhtml"
xmlns:ui="https://java.sun.com/jsf/facelets"
xmlns:h="https://java.sun.com/jsf/html"
xmlns:f="https://java.sun.com/jsf/core"
xmlns:p="https://primefaces.org/ui">
<h:head>
<script name="jquery/jquery.js" library="primefaces"></script>
</h:head>
<h:form>
<p:tree value="#{treeManagedBean.root}" var="node" dynamic="true" orientation="horizontal"
selectionMode="single" selection="#{treeManagedBean.singleSelectedTreeNode}">
<p:treeNode expandedIcon="ui-icon ui-icon-folder-open"
collapsedIcon="ui-icon ui-icon-folder-collapsed">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="document" icon="ui-icon ui-icon-document">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="image" icon="ui-icon ui-icon-image">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="video" icon="ui-icon ui-icon-video">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:ajax event="select" listener="#{treeManagedBean.onNodeSelect}"></p:ajax>
<p:ajax event="unselect" listener="#{treeManagedBean.onNodeUnSelect}"></p:ajax>
<p:ajax event="expand" listener="#{treeManagedBean.onNodeExpand}"></p:ajax>
<p:ajax event="collapse" listener="#{treeManagedBean.onNodeCollapse}"></p:ajax>
</p:tree>
</h:form>
</html>
Primefaces ContextMenu
“`
Primefaces te proporciona un componente especial que puede servirte para lograr ciertas operaciones contextuales. El componente ContextMenu se utiliza para eso, incluso el componente Tree está integrado con el menú contextual para aplicar esas operaciones ordenadas contra el nodo seleccionado y los nodos en caso de que hayas desarrollado selecciones múltiples. El atributo \(\text{for}\) de ContextMenu debe usarse para hacer referencia al atributo \(\text{id}\) del componente Tree, de modo que el menú definido se muestre cada vez que se seleccione un nodo específico dentro del componente Tree.
“`xml
Use clic derecho para mostrar el menú contextual
“`
Código index6.xhtml:
“`xml
<html xmlns="https://www.w3.org/1999/xhtml"
xmlns:ui="https://java.sun.com/jsf/facelets"
xmlns:h="https://java.sun.com/jsf/html"
xmlns:f="https://java.sun.com/jsf/core"
xmlns:p="https://primefaces.org/ui">
<h:head>
<script name="jquery/jquery.js" library="primefaces"></script>
</h:head>
<h:form>
<p:contextMenu for="tree">
<p:menuitem value="View" actionListener="#{treeManagedBean.view}" icon="ui-icon-search"></p:menuitem>
</p:contextMenu>
<p:tree id="tree" value="#{treeManagedBean.root}" var="node" dynamic="true" orientation="horizontal"
selectionMode="single" selection="#{treeManagedBean.singleSelectedTreeNode}">
<p:treeNode expandedIcon="ui-icon ui-icon-folder-open"
collapsedIcon="ui-icon ui-icon-folder-collapsed">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="document" icon="ui-icon ui-icon-document">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="image" icon="ui-icon ui-icon-image">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:treeNode type="video" icon="ui-icon ui-icon-video">
<h:outputText value="#{node}"/>
</p:treeNode>
<p:ajax event="select" listener="#{treeManagedBean.onNodeSelect}"></p:ajax>
<p:ajax event="unselect" listener="#{treeManagedBean.onNodeUnSelect}"></p:ajax>
<p:ajax event="expand" listener="#{treeManagedBean.onNodeExpand}"></p:ajax>
<p:ajax event="collapse" listener="#{treeManagedBean.onNodeCollapse}"></p:ajax>
</p:tree>
</h:form>
</html>
package com.journaldev.prime.faces.beans;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;
import org.primefaces.event.NodeCollapseEvent;
import org.primefaces.event.NodeExpandEvent;
import org.primefaces.event.NodeSelectEvent;
import org.primefaces.event.NodeUnselectEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
@ManagedBean
@SessionScoped
public class TreeManagedBean {
// Instancia de TreeNode
private TreeNode root;
private TreeNode singleSelectedTreeNode;
private TreeNode [] multipleSelectedTreeNodes;
private TreeNode [] checkboxSelectedTreeNodes;
public TreeManagedBean(){
// Este es el nodo raíz, por lo que su dato es raíz y su padre es nulo
this.root = new DefaultTreeNode("Root Node", null);
// Crear nodo de documentos
TreeNode documents = new DefaultTreeNode("Documents", this.root);
// Crear nodo de documento
TreeNode document01 = new DefaultTreeNode("document","Expenses.doc", documents);
// Crear nodo de imágenes
TreeNode images = new DefaultTreeNode("Images", this.root);
// Crear nodo de imagen
TreeNode image01 = new DefaultTreeNode("image","Travel.gif", images);
// Crear nodo de videos
TreeNode videos = new DefaultTreeNode("Videos", this.root);
// Crear nodo de video
TreeNode video01 = new DefaultTreeNode("video","Play.avi", videos);
}
public TreeNode getRoot() {
return root;
}
public void setRoot(TreeNode root) {
this.root = root;
}
public TreeNode getSingleSelectedTreeNode() {
return singleSelectedTreeNode;
}
public void setSingleSelectedTreeNode(TreeNode singleSelectedTreeNode) {
this.singleSelectedTreeNode = singleSelectedTreeNode;
}
public TreeNode[] getMultipleSelectedTreeNodes() {
return multipleSelectedTreeNodes;
}
public void setMultipleSelectedTreeNodes(TreeNode[] multipleSelectedTreeNodes) {
this.multipleSelectedTreeNodes = multipleSelectedTreeNodes;
}
public TreeNode[] getCheckboxSelectedTreeNodes() {
return checkboxSelectedTreeNodes;
}
public void setCheckboxSelectedTreeNodes(TreeNode[] checkboxSelectedTreeNodes) {
this.checkboxSelectedTreeNodes = checkboxSelectedTreeNodes;
}
public void onNodeSelect(NodeSelectEvent event){
System.out.println("Node Data ::"+event.getTreeNode().getData()+" :: Selected");
}
public void onNodeUnSelect(NodeUnselectEvent event){
System.out.println("Node Data ::"+event.getTreeNode().getData()+" :: UnSelected");
}
public void onNodeExpand(NodeExpandEvent event){
System.out.println("Node Data ::"+event.getTreeNode().getData()+" :: Expanded");
}
public void onNodeCollapse(NodeCollapseEvent event){
System.out.println("Node Data ::"+event.getTreeNode().getData()+" :: Collapsed");
}
public String printSelectedNodes(){
System.out.println("Single Selection Is :: "+this.singleSelectedTreeNode.getData());
for(TreeNode n : this.multipleSelectedTreeNodes){
System.out.println("Multiple Selection Are :: "+n.getData());
}
for(TreeNode n : this.checkboxSelectedTreeNodes){
System.out.println("CheckBox Selection Are :: "+n.getData());
}
return "";
}
public void view(ActionEvent e){
System.out.println("View action has invoked against node :: "+this.singleSelectedTreeNode.getData());
}
}
Primefaces TreeTable
TreeTable se utiliza para mostrar datos jerárquicos en formato tabular.
Introducción a Primefaces TreeTable
Es importante, antes de explorar el componente TreeTable, echar un vistazo a su información básica y atributos respectivamente.
Info | TreeTable |
---|---|
Component Class | org.primefaces.component.treetable.TreeTable |
Component Type | org.primefaces.component.TreeTable |
Component Family | org.primefaces.component |
Renderer Type | org.primefaces.component.TreeTableRenderer |
Renderer Class | org.primefaces.component.treetable.TreeTableRenderer |
Name | Default | Type | Description |
---|---|---|---|
id | null | String | Unique identifier of the component |
rendered | true | Boolean | Boolean value to specify the rendering of thecomponent, when set to false component willnot be rendered. |
binding | null | Object | An el expression that maps to a server sideUIComponent instance in a backing bean |
value | null | Object | A TreeNode instance as the backing model. |
var | null | String | Name of the request-scoped variable used torefer each treenode. |
widgetVar | null | String | Name of the client side widget |
style | null | String | Inline style of the container element. |
styleClass | null | String | Style class of the container element. |
selection | null | Object | Selection reference. |
selectionMode | null | String | Type of selection mode. |
scrollable | false | Boolean | Whether or not the data should be scrollable. |
scrollHeight | null | Integer | Height of scrollable data. |
scrollWidth | null | Integer | Width of scrollable data. |
tableStyle | null | String | Inline style of the table element. |
tableStyleClass | null | String | Style class of the table element. |
emptyMessage | No records found | String | Text to display when there is no data to display. |
resizableColumns | false | Boolean | Defines if colums can be resized or not. |
rowStyleClass | null | String | Style class for each row. |
liveResize | false | Boolean | Columns are resized live in this mode withoutusing a resize helper. |
required | false | Boolean | Validation constraint for selection. |
requiredMessage | null | String | Message for required selection validation. |
sortBy | null | ValueExpr | Expression for default sorting. |
sortOrder | ascending | String | Defines default sorting order. |
sortFunction | null | MethodExpr | Custom pluggable sortFunction for defaultsorting. |
nativeElements | false | Boolean | In native mode, treetable uses nativecheckboxes. |
dataLocale | null | Object | Locale to be used in features such as sorting,defaults to view locale. |
caseSensitiveSort | false | Boolean | Case sensitivity for sorting, insensitive bydefault. |
Similar al árbol, TreeTable se poblada con una instancia de TreeNode que corresponde al nodo raíz. La API de TreeNode tiene una estructura de datos jerárquica y representa los datos que se van a poblar en el árbol. El siguiente ejemplo muestra instancias de documentos de Plain Old Java Object (POJO) que se muestran utilizando el componente TreeTable. Código index7.xhtml:
<html xmlns="https://www.w3.org/1999/xhtml"
xmlns:ui="https://java.sun.com/jsf/facelets"
xmlns:h="https://java.sun.com/jsf/html"
xmlns:f="https://java.sun.com/jsf/core"
xmlns:p="https://primefaces.org/ui">
<h:head>
<script name="jquery/jquery.js" library="primefaces"></script>
</h:head>
<h:form>
<p:treeTable value="#{treeTableManagedBean.root}" var="node">
<p:column>
<f:facet name="header">
Name
</f:facet>
<h:outputText value="#{node.name}"></h:outputText>
</p:column>
<p:column>
<f:facet name="header">
Author
</f:facet>
<h:outputText value="#{node.author}"></h:outputText>
</p:column>
<p:column>
<f:facet name="header">
ID
</f:facet>
<h:outputText value="#{node.id}"></h:outputText>
</p:column>
</p:treeTable>
</h:form>
</html>
package com.journaldev.prime.faces.data;
public class Document {
private String name;
private String id;
private String author;
public Document(String name, String id,String author){
this.name = name;
this.id = id;
this.author = author;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
package com.journaldev.prime.faces.beans;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import com.journaldev.prime.faces.data.Document;
@ManagedBean
@SessionScoped
public class TreeTableManagedBean {
private TreeNode root = new DefaultTreeNode("Root Node", null);
public TreeTableManagedBean(){
// Poblar instancias de documentos
Document doc01 = new Document("Primefaces Tutorial","1","Primefaces Company");
Document doc02 = new Document("Hibernate Tutorial","2","JournalDev");
// Crear TreeNode de documentos
TreeNode documents = new DefaultTreeNode(new Document("Documents","0","Documents"), this.root);
// Crear TreeNode de documento
TreeNode document01 = new DefaultTreeNode(doc01, documents);
TreeNode document02 = new DefaultTreeNode(doc02, documents);
}
public TreeNode getRoot() {
return root;
}
public void setRoot(TreeNode root) {
this.root = root;
}
}
Primefaces TreeTable – Selección
Similar al componente Tree, la selección de nodos es una funcionalidad incorporada mediante la cual puedes determinar el tipo de selección; Individual, múltiple y casilla de verificación son los valores que podrías utilizar. La selección individual vinculará tu nodo seleccionado en una instancia de TreeNode, mientras que otros han utilizado un array de TreeNode. El siguiente ejemplo te muestra cómo puedes encapsular las selecciones del usuario mostrando Mensaje Growl. Este ejemplo utiliza p:commandButton proporcionado por Primefaces, del cual se discutirá más adelante. Código index8.xhtml:
<html xmlns="https://www.w3.org/1999/xhtml"
xmlns:ui="https://java.sun.com/jsf/facelets"
xmlns:h="https://java.sun.com/jsf/html"
xmlns:f="https://java.sun.com/jsf/core"
xmlns:p="https://primefaces.org/ui">
<h:head>
<script name="jquery/jquery.js" library="primefaces"></script>
</h:head>
<h:form>
<p:growl id="message">
</p:growl>
<p:treeTable value="#{treeTableManagedBean.root}" var="node" selectionMode="single"
selection="#{treeTableManagedBean.singleSelectedNode}">
<p:column>
<f:facet name="header">
Name
</f:facet>
<h:outputText value="#{node.name}"></h:outputText>
</p:column>
<p:column>
<f:facet name="header">
Author
</f:facet>
<h:outputText value="#{node.author}"></h:outputText>
</p:column>
<p:column>
<f:facet name="header">
ID
</f:facet>
<h:outputText value="#{node.id}"></h:outputText>
</p:column>
</p:treeTable>
<p:treeTable value="#{treeTableManagedBean.root}" var="node" selectionMode="multiple"
selection="#{treeTableManagedBean.multipleSelectedNodes}">
<p:column>
<f:facet name="header">
Name
</f:facet>
<h:outputText value="#{node.name}"></h:outputText>
</p:column>
<p:column>
<f:facet name="header">
Author
</f:facet>
<h:outputText value="#{node.author}"></h:outputText>
</p:column>
<p:column>
<f:facet name="header">
ID
</f:facet>
<h:outputText value="#{node.id}"></h:outputText>
</p:column>
</p:treeTable>
<p:treeTable value="#{treeTableManagedBean.root}" var="node" selectionMode="checkbox"
selection="#{treeTableManagedBean.checkboxSelectedNodes}">
<p:column>
<f:facet name="header">
Name
</f:facet>
<h:outputText value="#{node.name}"></h:outputText>
</p:column>
<p:column>
<f:facet name="header">
Author
</f:facet>
<h:outputText value="#{node.author}"></h:outputText>
</p:column>
<p:column>
<f:facet name="header">
ID
</f:facet>
<h:outputText value="#{node.id}"></h:outputText>
</p:column>
</p:treeTable>
<p:commandButton value="Show Selected Documents" action="#{treeTableManagedBean.viewSelectedNodes}" process="@form" update="message">
</p:commandButton>
</h:form>
</html>
package com.journaldev.prime.faces.beans;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import com.journaldev.prime.faces.data.Document;
@ManagedBean
@SessionScoped
public class TreeTableManagedBean {
private TreeNode root = new DefaultTreeNode("Root Node", null);
private TreeNode singleSelectedNode;
private TreeNode [] multipleSelectedNodes;
private TreeNode [] checkboxSelectedNodes;
public TreeTableManagedBean(){
// Poblar instancias de documentos
Document doc01 = new Document("Primefaces Tutorial","1","Primefaces Company");
Document doc02 = new Document("Hibernate Tutorial","2","JournalDev");
// Crear TreeNode de documentos
TreeNode documents = new DefaultTreeNode(new Document("Documents","0","Documents"), this.root);
// Crear TreeNode de documento
TreeNode document01 = new DefaultTreeNode(doc01, documents);
TreeNode document02 = new DefaultTreeNode(doc02, documents);
}
public TreeNode getRoot() {
return root;
}
public void setRoot(TreeNode root) {
this.root = root;
}
public TreeNode getSingleSelectedNode() {
return singleSelectedNode;
}
public void setSingleSelectedNode(TreeNode singleSelectedNode) {
this.singleSelectedNode = singleSelectedNode;
}
public TreeNode[] getMultipleSelectedNodes() {
return multipleSelectedNodes;
}
public void setMultipleSelectedNodes(TreeNode[] multipleSelectedNodes) {
this.multipleSelectedNodes = multipleSelectedNodes;
}
public TreeNode[] getCheckboxSelectedNodes() {
return checkboxSelectedNodes;
}
public void setCheckboxSelectedNodes(TreeNode[] checkboxSelectedNodes) {
this.checkboxSelectedNodes = checkboxSelectedNodes;
}
public String viewSelectedNodes(){
String message = "You've selected documents :: ";
message+="- "+((Document)this.singleSelectedNode.getData()).getName()+"\n";
for(TreeNode node : this.multipleSelectedNodes){
message+="- "+((Document)node.getData()).getName()+"\n";
}
for(TreeNode node : this.checkboxSelectedNodes){
message+="- "+((Document)node.getData()).getName()+"\n";
}
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(message));
return "";
}
}
Primefaces TreeTable – Eventos de Comportamiento Ajax y Menú Contextual
TreeTable ha admitido los mismos eventos de comportamiento Ajax que ya vienen con el componente Tree. Un evento excepcional es colResize que se activaría cuando se redimensiona una columna. Además, el uso de ContextMenu no difiere de lo que ocurre en el componente Tree. Desafortunadamente, la versión gratuita de Primefaces 5.0 que ya se está utilizando tiene un problema crucial que nos impide aclarar la escucha del evento de redimensionamiento de columnas, pero para simplemente saber cómo se podría escuchar ese evento se proporciona un ejemplo simple a continuación: código de index9.xhtml:
<html xmlns="https://www.w3.org/1999/xhtml"
xmlns:ui="https://java.sun.com/jsf/facelets"
xmlns:h="https://java.sun.com/jsf/html"
xmlns:f="https://java.sun.com/jsf/core"
xmlns:p="https://primefaces.org/ui">
<h:head>
<script name="jquery/jquery.js" library="primefaces"></script>
</h:head>
<h:form>
<p:treeTable value="#{treeTableManagedBean.root}" var="node" resizableColumns="true">
<p:column>
<f:facet name="header">
Name
</f:facet>
<h:outputText value="#{node.name}"></h:outputText>
</p:column>
<p:column>
<f:facet name="header">
Author
</f:facet>
<h:outputText value="#{node.author}"></h:outputText>
</p:column>
<p:column>
<f:facet name="header">
ID
</f:facet>
<h:outputText value="#{node.id}"></h:outputText>
</p:column>
<p:ajax event="colResize" listener="#{treeTableManagedBean.colResizeListener}"></p:ajax>
</p:treeTable>
</h:form>
</html>
// .. Código requerido
public void colResizeListener(ColumnResizeEvent e){
String message ="Column resize event is thrown";
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(message));
}
Primefaces TreeTable – Ordenación
La ordenación se habilita configurando expresiones sortBy a nivel de columna. Código de index10.xhtml:
<html xmlns="https://www.w3.org/1999/xhtml"
xmlns:ui="https://java.sun.com/jsf/facelets"
xmlns:h="https://java.sun.com/jsf/html"
xmlns:f="https://java.sun.com/jsf/core"
xmlns:p="https://primefaces.org/ui">
<h:head>
<script name="jquery/jquery.js" library="primefaces"></script>
</h:head>
<h:form>
<p:treeTable value="#{treeTableManagedBean.root}" var="node">
<p:column sortBy="#{node.name}">
<f:facet name="header">
Name
</f:facet>
<h:outputText value="#{node.name}"></h:outputText>
</p:column>
<p:column sortBy="#{node.author}">
<f:facet name="header">
Author
</f:facet>
<h:outputText value="#{node.author}"></h:outputText>
</p:column>
<p:column sortBy="#{node.id}">
<f:facet name="header">
ID
</f:facet>
<h:outputText value="#{node.id}"></h:outputText>
</p:column>
</p:treeTable>
</h:form>
</html>
En caso de que desee mostrar TreeTable ordenado al cargar la página, utilice el atributo sortBy de TreeTable; opcionalmente, se proporcionan los atributos sortOrder y sortFunction para definir el orden de clasificación predeterminado (ascendente o descendente) y un método Java para la clasificación actual, respectivamente.
Resumen de Primefaces Tree TreeNode TreeTable
Los componentes Tree y TreeTable se utilizan intensivamente para mostrar datos jerárquicos estructurales. Aprendimos cómo utilizar estos componentes correctamente y cuáles son los principales atributos que se necesitan. Contribuye comentando a continuación y para tu uso, descarga el código fuente a continuación.