====== Primefaces ======
**Versión: 4.0.6**
En esta sección vamos a exponer los componentes primefaces recomendados desde MNCS para desarrollar las aplicaciones Fundeweb 2.0. En caso de querer consultar el listado completo de los componentes primefaces disponibles, podéis visitar su página de demostración en la url http://www.primefaces.org/showcase/ui/home.jsf
Es importante destacar que la versión de primefaces que contiene esa página de demo no está disponible aún para los desarrolladores, por lo que algún componente puede comportarse de manera ligeramente diferente a la vista en la demo. Los componentes sujetos a cambios en la versión están sombreados en el menú de demostración de primefaces.
Los componentes básicos o con una explicación suficiente en la demo de primefaces aparecen únicamente referenciados en esta guía. Los que hemos encontrado algo más complejos, novedosos, o que requieren un comportamiento especial han sido analizados. Estos análisis se pueden ampliar en base a las necesidades que surjan durante los desarrollos.
===== Componentes de entrada de datos =====
==== AutoComplete ====
http://www.primefaces.org/showcase/ui/autocompleteHome.jsf
Este componente es una variante del componente InputText que filtra en el modelo los valores que concuerden con los caracteres introducidos en el filtro. Se puede permitir que se introduzcan valores no existentes en el filtro o impedirlo (según se desee).
Las propiedades a destacar son las siguientes:
- **minQueryLength**: Indica el número mínimo de caracteres que deberemos escribir para mostrar la lista de opciones.
- **completeMethod**: Método que devuelve la lista de opciones en base a los caracteres introducidos.
- **converter**: Conversor para los objectos que maneje el componente.
- **forceSelection**: Fuerza que el valor introducido en el input deba estar dentro de la lista de opciones o no.
Un ejemplo del código html
En este caso hemos mapeado directamente los datos a POJOs por lo que el código del conversor quedaría de la siguiente manera:
@FacesConverter(value = "conversorProvincias", forClass = Provincias.class)
@RequestScoped
public class ConversorProvincias implements Converter {
private static final Logger log = Logger
.getLogger(ConversorProvincias.class);
//BeanManager necesario para recuperar los beans que hay cargados en el servidor
//es el equivalente el Component.getInstance
private BeanManager bm;
@Override
public Object getAsObject(FacesContext context, UIComponent component,
String value) {
ResourcesUtil ru = null;
try {
bm = (BeanManager) InitialContext.doLookup("java:comp/BeanManager");
//Recuperamos un bean de utilidad que contiene al entityManager que necesitamos
//para realizar la búsqueda
for (Bean b : bm.getBeans(ResourcesUtil.class)) {
ru = (ResourcesUtil) bm.getReference(b, ResourcesUtil.class,
bm.createCreationalContext(b));
}
} catch (NamingException e) {
log.error("Error obteniendo entityManager", e);
}
if (!UtilString.esCadenaVacia(value)) {
Query consulta = ru.getEm().createNamedQuery("obtenerProvinciasId");
consulta.setParameter("codigo", value);
return consulta.getSingleResult();
} else {
return null;
}
}
@Override
public String getAsString(FacesContext context, UIComponent component,
Object value) {
if (value != null) {
return ((Provincias) value).getProCodigo();
} else {
return "";
}
}
}
Por último el código del método que devuelve la lista de opciones en base a los datos introducidos:
public List autocompleteProvincia(String query) {
List provincias = new ArrayList();
Query consulta = em.createNamedQuery("obtenerProvinciasLike");
consulta.setParameter("filtro",query.toUpperCase()+"%");
provincias = consulta.getResultList();
return provincias;
}
==== BoolCheckbox ====
http://www.primefaces.org/showcase/ui/selectBooleanCheckbox.jsf
==== Calendar ====
http://www.primefaces.org/showcase/ui/calendarAjax.jsf
Componente simple de selección de fecha, que o bien puede mostrarse al hacer click sobre el campo de texto asociado, o bien mediante un botón. Dentro de las características principales podemos destacar las siguientes:
- **pattern**: Permite especificar el patron de fecha que queremos mostrar.
- **shwOn**: Permite especificar si queremos que el calendario se despliegue al pulsar un botón.
- **locale**: Permite especificar el idioma en el que se mostrará el calendario.
Importante: Fundeweb ya incluye las librerias necesarias para el locale en castellano, no obstante si se quiere añadir otro idioma diferente del inglés o el español, o bien para aplicaciones no Fundeweb, es necesario, aparte de especificar el locale al componente, añadir en el directorio de recursos un fichero de nombre "calendar_(nombre del locale).js" (calendar_es.js para español). Un ejemplo del contenido de ese fichero (en español) es el siguiente:
PrimeFaces.locales['es'] = {
closeText: 'Cerrar',
prevText: 'Anterior',
nextText: 'Siguiente',
monthNames: ['Enero','Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'],
monthNamesShort: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun','Jul','Ago','Sep','Oct','Nov','Dic'],
dayNames: ['Domingo','Lunes','Martes','Miércoles','Jueves','Viernes','Sábado'],
dayNamesShort: ['Dom','Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab'],
dayNamesMin: ['D','L','M','X','J','V','S'],
weekHeader: 'Semana',
firstDay: 1,
isRTL: false,
showMonthAfterYear: false,
yearSuffix: '',
timeOnlyTitle: 'Sólo hora',
timeText: 'Tiempo',
hourText: 'Hora',
minuteText: 'Minuto',
secondText: 'Segundo',
currentText: 'Fecha actual',
ampm: false,
month: 'Mes',
week: 'Semana',
day: 'Día',
allDayText : 'Todo el día'
}
Un ejemplo del código del componente sería el siguiente:
==== Editor ====
http://www.primefaces.org/showcase/ui/editor.jsf
Editor de texto enriquecido con barra de opciones configurable mediante la propiedad "controls".
El contenido del editor se guarda en formato html utilizando los caracteres de escape para los signos reservados.
Las posibles opciones de configuración de la propiedad "controls" se especifican una a una separas por espacios.
Estas opciones son las siguientes:
//bold, italic, underline, strikethrough, subscript, superscript, font, size, style, color, highlight, removeformat, bullets, numbering, outdent, indent
alignleft, center, alignright, justify, undo, redo, rule, image, link, unlink, cut, copy, paste, pastetext, print, source (muestra el codigo html que se va generando)//
Un ejemplo de código sería el siguiente:
====FileUpload====
http://www.primefaces.org/showcase/ui/fileUploadMultiple.jsf
Componente de subida de ficheros. Permite subir múltiples ficheros y limitar tanto el tamaño y tipo de los mismos, como la cantidad máxima de ficheros a subir.
Podemos hacer uso de dos casos, el simple que utiliza características del navegador y presenta una funcionalidad más recortada, o el avanzado que amplia las funcionalidades del componente, modifica el estilo visual y está basado en HTML5 (importante asegurar la compatibilidad del navegador).
**Modo simple**
Este modo es parecido al que se puede simular por javascript. Recoge un fichero simple y lo sube al servidor tras hacer submit. Requiere, por tanto, un botón para ejecutar la acción que suba el documento.
**Modo avanzado**
En este modo se nos permiten funcionalidades avanzadas como subir múltiples documentos a la vez usando ajax. Validaciones directas en el componente, visualización del listado de documentos, etc...
Las propiedades más relevantes son:
-**multiple**: Permite la subida múltiple de ficheros.
-**sizeLimit**: Tamaño máximo de fichero en bytes.
-**auto**: Subida automática de ficheros.
-**allowTypes**: Expresión regular para filtrar el tipo de ficheros.
El componente por defecto limpia la lista de los ficheros que se han subido, en caso de querer mantenerla, de momento, se debe hacer mediante un componente a parte que se refresque con los nombres de los mismos.
El código de ejemplo es el siguiente:
====InputMask====
http://www.primefaces.org/showcase/ui/inputMask.jsf
Este componente nos permite asignar un patrón a un inputText de manera que los datos que introduzcamos se ajusten al patrón especificado.
Para completar la funcionalidad podemos añadir un validador de patrones para lanzar los posibles errores que pudiera ocasionar la inserción de los datos.
La propiedad **pattern** nos permite indicar el patrón que tendrá el valor a introducir. Para ver más ejemplos de patrones, visitad el enlace del componente.
El código de ejemplo es el siguiente:
==== InputText ====
http://www.primefaces.org/showcase/ui/inputText.jsf
====InputTextarea====
http://www.primefaces.org/showcase/ui/inputTextarea.jsf
====OneListbox====
http://www.primefaces.org/showcase/ui/selectOneListbox.jsf
====Password====
http://www.primefaces.org/showcase/ui/password.jsf
====PickList====
http://www.primefaces.org/showcase/ui/picklist.jsf
Este componente nos permite seleccionar un conjunto de elementos en una lista. Primefaces incorpora una clase Java **DualListModel** que permite especificar la lista origen y la lista destino.
http://www.primefaces.org/docs/api/3.4/org/primefaces/model/DualListModel.html
Nota: Para ocultar los botontes añadir o eliminar todos hay que sobreescribir el css del botón:
.ui-picklist-button-add-all {
visibility: hidden !important;
}
.ui-picklist-button-remove-all {
visibility: hidden !important;
}
El código del componente
Disponibles
Seleccionadas
====Rating====
http://www.primefaces.org/showcase/ui/rating.jsf
====Schedule====
Este componente nos provee de una agenda al estilo Outlook para anotar diferentes eventos. Permite crearlos, modificarlos y moverlos. Este componente debe estar controlado por un bean de tipo sesión.
Las propiedades más importantes son:
-**timeZone**: Para ajustar el timezone a nuestra franja horaria.
-**slotMinutes**: Nos permite definir el rango de minutos que contiene un slot en las vistas de semana o día.
-**view**: 'month', 'agendaDay', 'agendaWeek' nos permiten seleccionar la vista por defecto del componente.
-**allDaySlot**: Indica si en la vista de día o semana se añade una ranura para indicar "todo el día".
El componente tiene una serie de eventos que nos sirven para interactuar con él. Los más destacados son:
-**dateSelect**: Evento que se lanza cuando hacemos click sobre una fecha de la agenda.
-**eventSelect**: Evento que se lanza cuando hacemos click en un evento de la agenda.
-**eventMove**: Evento que se lanza cuando movemos un evento de la agenda.
-**evenResize**: Evento que se lanza cuando redimensionamos un evento de la agenda .
El código fuente es el siguiente:
==== SelectOneMenu ====
http://www.primefaces.org/showcase/ui/selectOneMenu.jsf
Este componente, está representado por un ComboBox que nos permite seleccionar un valor. En este ejemplo hemos ilustrado este componente mostrando los resultados ordenados por grupos.
El codigo html de ejemplo es:
Para poder agrupar los resultados deberemos crear SelectItems e introducirlos en SelectItemGroup de la siguiente manera:
//Key es el label que queremos que se muestre en el grupo
SelectItemGroup grupo = new SelectItemGroup(key);
//setSelectItems requiere un array, para ello transformamos a array una lista de objetos de tipo SelectItems
//Para ello hacemos uso de la clase Arrays
grupo.setSelectItems(Arrays.copyOf(provs.get(key).toArray(),
provs.get(key).toArray().length, SelectItem[].class));
====SelectOneRadio====
http://www.primefaces.org/showcase/ui/selectOneRadio.jsf
Este componente crea un grupo de radiobuttons que nos permite seleccionar una opción de entre las expuestas. Al mismo tiempo nos permite diseñar el layout de los botones como queramos dándonos total libertad y permitiéndonos combinarlo con otro tipo de componentes.
Para poder crear un diseño personalizado tenemos que poner la opcion **layout** con valor custom. Para posteriormente codificar la visualización del mismo.
En el ejemplo que mostraremos a continuación hemos diseñado un radiobutton vertical con un componente adicional en cada opción.
Importante: Actualmente hay un bug en chrome e IE que al refrescar con ajax el componente se queda deshabilitado, funciona correctamente en Firefox.
====Spinner====
http://www.primefaces.org/showcase/ui/spinner.jsf
====Tree====
http://www.primefaces.org/showcase/ui/treeHome.jsf
====TreeTable====
http://www.primefaces.org/showcase/ui/treeTableHome.jsf
Este componente nos permite combinar la funcionalidad de árbol con la claridad de agrupación de una tabla. La principal diferencia con un árbol es que todos los objetos deben devolver algún valor para cada una de las columnas, por lo que hay que tener en cuenta esto a la hora de mostrar los datos.
Este componente permite que se le añada un menú contextual para realizar acciones avanzadas. Este menú se mostrará al hacer clic derecho sobre el nodo correspondiente.
El código de ejemplo es el siguiente
Selector de provincias
Provincia
Longitud Nombre
Acciones
**NOTA**: No funciona bien en primefaces 3.5.8
https://code.google.com/p/primefaces/issues/detail?id=5823
====Wizard====
http://www.primefaces.org/showcase/ui/wizard.jsf
Este componente permite de manera sencilla crear un wizard para la inserción de datos en el sistema permitiéndonos navegación hacia delante y hacia atrás.
Este comportamiento no incluye un botón "Finalizar" en la última pantalla por defecto, por lo que deberemos añadirlo nosotros mismos en el último formulario, o bien hacer un estilo de botones personalizado.
Las propiedades más relevantes del componente son las siguientes:
-**flowListener**: Método java que recibe los eventos de cambio de pestaña (avanzamos o retrocedemos en el menú).
-**showNavBar**: Nos permite quitar los botones, por defecto, que trae el Wizard para añadir los nuestros.
Un ejemplo de código
Panel datos estadísticos
Selección de asignaturas
Detalles del pago
Panel resumen final
En el caso que queramos personalizar los botones del wizard debemos ocultar la barra de navegacion **showNavBar:false** e incorporar después del wizard los botones correspondientes.
Para poder navegar hacia delante o hacia atrás debemos invocar la acción javascript correspondiente del wizard, para ello lo invocaremos usando el valor de la propiedad **widgetVar="wiz"** de la siguiente manera:
===== Componentes de salida de datos=====
====Carousel ====
- http://www.primefaces.org/showcase/ui/carousel.jsf
====Chart====
http://www.primefaces.org/showcase/ui/barChart.jsf
Este componente permite dibujar diferentes diagramas para mostrar datos. En este caso hemos escogido el diagrama de barras que tiene las siguientes propiedades de interés:
-**legendPosition**: Posición de la leyenda dentro del diagrama.
-**legendCols**: Número de columnas de la leyenda (permite mostrarla en vertical u horizontal).
-**shadow**: Sobrea las columnas.
-**animate**: Muestra el diagrama mediante una animación.
-**showDatatip**: Muestra el valor de la columna al pasar el ratón por encima.
-**datatipFormat**: Establece el formato del DataTipo que se muestra al pasar por la columna.
El código fuente para el diagrama es el siguiente:
==== DataExporter ====
http://www.primefaces.org/showcase/ui/exporter.jsf
Este componente nos permite exportar en diferentes formatos(PDF,XML,XSL,CSV) el contenido de una tabla. Permitiéndonos exportar toda la tabla o sólo la página que estamos viendo.
Importante: Para la exportación de PDF hay que asegurarse de que tenemos la librería de iText configurada en nuestro proyecto.
Las propiedades más importantes son:
**En la tabla**
- **exportable**: Situado en el componente "" nos indica si queremos que esa columna sea exportable o no.
- **** Deberemos nombrar así la cabecera de la columna para que aparezca en la exportación.
**En el componente**
- **type**: El tipo de exportacion que queremos realizar (pdf,xls,xml,csv).
- **target**: El id de la tabla que queremos exportar.
El código de ejemplo es el siguiente:
====DataList====
http://www.primefaces.org/showcase/ui/dataListUnordered.jsf
====DataGrid====
http://www.primefaces.org/showcase/ui/datagrid.jsf
==== DataTable ====
http://www.primefaces.org/showcase/ui/datatablePagination.jsf
Tabla que muestra los elementos almacenados en el bean de respaldo en forma de listado. Primefaces nos proporciona diversos tipos de tablas, siendo la más recomendable la tabla paginada con carga difertida (LazyLoad DataTable) que es la que tratamos en este ejemplo.
Dicha tabla nos provee de filtrado, ordenamiento y paginación manteniendo en memoria sólo la información que se está mostrando. Para ello necesitamos crear una estructura de clases concreta para que el componente realice las cargas conforme vayamos paginando.
Las principales propiedades de este componente son las siguientes:
- **paginator**: Indica si queremos paginación.
- **rows**: Número de líneas que se muestran por defecto.
- **paginatorPosition**: Posición donde queremos que se muestre la paginación.
- **paginatorTemplate**: Permite indicar qué botones queremos mostrar en el paginador.
- **rowsPerPageTemplate**: Permite indicar los diferentes números de líneas que podemos mostrar en la pantalla para que el usuario seleccione cuales quiere visualizar.
- **lazy**: Permite indicar si se cargan todos los datos de golpe o no.
- **emptyMessage**: Permite indicar el mensaje que mostramos cuando no hay filas disponibles.
El código html de ejemplo de esta tabla es el siguiente:
Hay que destacar que manejadorAnuncios.buscadorAnuncios, devuelve una clase que extiende la clase abstracta LazyDataModel. Esta clase nos provee del mecanismo de carga bajo demanda que necesitamos para nuestra tabla.
El código de esta clase para el ejemplo es el siguiente:
public class LazyAnuncioDataModel extends LazyDataModel {
private static final long serialVersionUID = -7128353552033320971L;
private ServicioAnuncios servicioAnuncios;
private String namedQuery;
private String countQuery;
private HashMap parametros;
private List anuncios;
public LazyAnuncioDataModel(ServicioAnuncios servicioAnuncios) {
this.servicioAnuncios = servicioAnuncios;
anuncios = new ArrayList();
}
@Override
public Object getRowKey(Anuncio anuncio) {
return anuncio.getId();
}
@Override
public List load(int first, int pageSize, String sortField,
SortOrder sortOrder, Map filters) {
// En este ejemplo básico no utilizamos ni el sort ni los filtros
if (parametros == null) {
parametros = new HashMap();
}
//Obtenemos los anuncios que ocupen la posicion first hasta pageSize
anuncios = servicioAnuncios.ejecutaNamedQuery(namedQuery, parametros,
first, pageSize);
//Indicamos el número total de registros de la consulta (para poder establecer el número de páginas)
setRowCount(servicioAnuncios.obtenTotalRegistros(
countQuery, parametros));
if (anuncios != null) {
return anuncios;
} else {
return new ArrayList();
}
}
@Override
public Anuncio getRowData(String rowKey) {
for (Anuncio an : anuncios) {
if (Long.toString(an.getId()).equals(rowKey))
return an;
}
return null;
}
}
====DataGrid====
http://www.primefaces.org/showcase/ui/datagrid.jsf
====DataList====
http://www.primefaces.org/showcase/ui/dataListUnordered.jsf
==== Gmap ====
http://www.primefaces.org/showcase/ui/gmapHome.jsf
Este componente pinta un mapa de google en nuestra aplicación y nos permite interactuar con él. Así pues podemos dar de alta marcadores o consultar su información.
Para que el mapa se muestre hay que añadir el siguiente código a la cabecera de nuestra página web:
Importante: El componente aún no funciona correctamente (pendiente de estabilizar). Podemos utilizarlo para visualizar marcadores puestos y consultar la información que hayamos dispuesto para ellos, pero no nos permite insertar uno e inmediatamente consultar la información introducida.
No se puede hacer un "update" del componente ya que desaparece, y el bean de respaldo sobre el que se basa ha de tener ámbito de Sesión.
El código a continuación mostrado combina la visualización de la información con la introducción de la misma, pero actualmente no funcionan ambas cosas a la vez.
====OverlayPanel====
http://www.primefaces.org/showcase/ui/overlayPanel.jsf
===== Componentes de acciones=====
====Button====
http://www.primefaces.org/showcase/ui/button.jsf
==== CommandButton ====
http://www.primefaces.org/showcase/ui/commandButton.jsf
====CommandLink====
http://www.primefaces.org/showcase/ui/commandLink.jsf
Botón para realizar una acción contra el servidor. Como novedad, la acción ajax viene configurada como acción por defecto en vez de un submit normal. Este componente permite reRenderizado y procesamiento parcial de los datos. Las propiedades principales son las siguietnes:
- **process**: Permite indicar qué campos se van a procesar, especificados mediante una lista de id separados por espacios. Como elementos especiales están: "@all" procesa todos los componentes, @this procesa solo el botón, @form procesa el formulario que contiene el botón, @none no procesa ningún elemento, @parent: procesa los hijos del elemento padre del botón
- **update**: Permite refrescar los componentes indicados en este campo (lista separada por espacios), para que el componente localice los id que no están en el mismo formulario se debe poner ":" delante del id.
Un ejemplo de código
=====Componentes de panel=====
====Accordion====
http://www.primefaces.org/showcase/ui/accordionPanelHome.jsf
==== Dialog ====
http://www.primefaces.org/showcase/ui/dialogHome.jsf
Componente para crear un modalPanel que aparezca como un popUp para que podamos realizar acciones adicionales, consultar datos, utilizar como ayuda, etc...
Dentro de sus propiedades principales podemos destacar:
- **position**: Posición en la pantalla en la que queremos que aparezca el panel.
- **modal**: Con esta opción habilitada el panel bloqueará la pantalla sobre la que aparece, dejando sólo realizar acciones sobre su contenido.
- **closeable**: Habilita un icono en la esquina superior derecha para cerrar el panel.
- **appendToBody**: Posiciona el panel en al final del HTML generado y garantiza su procesamiento.
- **widgetVar**: Nombre del panel para poder realizar acciones javascript sobre él, como mostrarlo u ocultarlo.
...
...
...
====Fieldset====
http://www.primefaces.org/showcase/ui/fieldset.jsf
====Layout====
http://www.primefaces.org/showcase/ui/layoutHome.jsf
====OutputPanel====
http://www.primefaces.org/showcase/ui/outputPanel.jsf
====Panel====
http://www.primefaces.org/showcase/ui/panel.jsf
====PanelGrid====
http://www.primefaces.org/showcase/ui/panelGrid.jsf
====ScrollPanel====
http://www.primefaces.org/showcase/ui/scrollPanel.jsf
====TabView====
http://www.primefaces.org/showcase/ui/tabviewHome.jsf
====Toolbar====
http://www.primefaces.org/showcase/ui/toolbar.jsf
===== Componentes de Menú =====
====BreadCrumb====
http://www.primefaces.org/showcase/ui/breadCrumb.jsf
====ContextMenu====
http://www.primefaces.org/showcase/ui/contextMenu.jsf
====Menu====
http://www.primefaces.org/showcase/ui/menu.jsf
====MegaMenu====
http://www.primefaces.org/showcase/ui/megaMenu.jsf
==== MenuBar ====
http://www.primefaces.org/showcase/ui/menubar.jsf
Este componente nos proporciona una barra de menú horizontal a la que podremos ir añadiéndole opciones. Se comporta de manera idéntica a una barra de menú de cualquier aplicación de escritorio.
A la hora de construir el menú podemos diferenciar los siguientes elementos:
- **menuitem**: Representa un elemento del menú simple, sin hijos, al hacer click sobre él se ejecutará una acción.
- **submenu**: Representa un elemento del menú, compuesto por varios menuitem, que tiene hijos (submenú). Al poner el ratón sobre él se desplegará mostrando los menuitem que contiene.
- **options**: A traves de un "f:facet" especificamos un grupo de elementos que irá alineado a la derecha del todo.
Un ejemplo de código es el siguiente:
====PanelMenu====
http://www.primefaces.org/showcase/ui/panelMenu.jsf
===== Componentes multimedia =====
====DynaImage====
http://www.primefaces.org/showcase/ui/dynamicImage.jsf
====Galleria====
http://www.primefaces.org/showcase/ui/galleria.jsf
====Media====
http://www.primefaces.org/showcase/ui/media.jsf
====LightBox====
http://www.primefaces.org/showcase/ui/lightBox.jsf
===== Componentes de Avisos =====
====ConfirmDialog====
http://www.primefaces.org/showcase/ui/confirmDialog.jsf
==== Messages ====
http://www.primefaces.org/showcase/ui/messages.jsf
Componente para mostrar los mensajes faces que produzca el sistema. Creará una barra superior que agrupará los mensajes del mismo tipo en ella. Fundeweb por defecto lo incorpora en sus templates, por lo tanto no es necesario introducirlo en las aplicaciones desarrolladas con este framework.
=====Miscelánea=====
====BlockUI====
http://www.primefaces.org/showcase/ui/blockUI.jsf
Permite bloquear componentes jsf cuando se está ejecutando ajax.
====Captcha====
http://www.primefaces.org/showcase/ui/captchaHome.jsf
====Collector====
http://www.primefaces.org/showcase/ui/collector.jsf
Permite gestionar colecciones en cliente (crear, eliminar). Minimiza las llamadas al servidor.
====Focus====
http://www.primefaces.org/showcase/ui/focus.jsf
====HotKey====
http://www.primefaces.org/showcase/ui/hotkey.jsf
Liga las teclas al cliente para realizar acciones.
====ProgressBar====
http://www.primefaces.org/showcase/ui/progressBar.jsf
====Sticky====
http://www.primefaces.org/showcase/ui/sticky.jsf
Este componente permite que un elemento de nuestra página siempre quede visible aunque esta tenga scroll vertical. Alinea el componente en el top de la pantalla y lo mantiene visible en todo momento.
====Tooltip====
http://www.primefaces.org/showcase/ui/tooltipHome.jsf
===== FAQ =====
====El editor de primefaces p:editor, aparece deshabilitado cuando lo introduzco en un panel y lo visualizo====
Cuando introducimos el componente editor en un panel, a la hora de pintar el panel, lo hacemos normalmente por javascript, por lo tanto el editor no se encuentra preparado para la edición cuando se pinta, para ello debemos actualizar el formulario que contiene dicho editor.
En este código se muestra cómo se pinta el panel desde un botón. En el "oncomplete" nos encargamos de pintar el panel mediante javascript, la modificación importante es **update=":modalPanelForm"** ahí es donde indicamos que actualice el formulario, que en este caso contiene el editor.