¿Cómo hacer una grilla del componente compuesto JSF?

Tengo muchos de los pares outputLabel y inputText en panelGrids

     ...  

Quiero tener un comportamiento para todos ellos: como la misma validación o el mismo tamaño para cada texto de entrada. Así que he creado un componente compuesto que solo incluye un outputLabel y un inputText

   

Pero ahora cuando los pongo en un gridPanel, no se alinean según la longitud del texto de la etiqueta. Entiendo por qué, pero no sé cómo evitarlo.

Un componente compuesto realmente se representa como un componente único. En su lugar, quiere usar un archivo de etiqueta Facelet. Se renderiza exactamente como lo que sea que rinda su salida. Este es un ejemplo inicial, suponiendo que desea un formulario de 3 columnas con un campo de mensaje en la tercera columna.

Cree el archivo de etiqueta en /WEB-INF/tags/input.xhtml (o en /META-INF cuando desee proporcionar tags en un archivo JAR que se incluirá en /WEB-INF/lib ).

                                          

/WEB-INF/example.taglib.xml en /WEB-INF/example.taglib.xml (o en /META-INF cuando desee proporcionar tags en un archivo JAR que se incluirá en /WEB-INF/lib ):

   http://example.com/jsf/facelets  input tags/input.xhtml   

Declare el uso de taglib en /WEB-INF/web.xml (esto no es necesario cuando las tags son proporcionadas por un archivo JAR que se incluye en /WEB-INF/lib ! JSF cargará automáticamente todos los archivos *.taglib.xml de /META-INF ).

  javax.faces.FACELETS_LIBRARIES /WEB-INF/example.taglib.xml  

(múltiples archivos taglib se pueden separar por punto ; coma ; )

Finalmente solo declarelo en sus plantillas de página principal.

    Facelet tag file demo             

(el #{bean.countries} debería devolver un Map con códigos de país como claves y nombres de países como valores)

Captura de pantalla:

enter image description here

Espero que esto ayude.

Debería haber un interruptor en panelGrid para representar componentes compuestos por separado. Tengo una solución para esto. Puede tener componentes compuestos separados en lugar de agruparlos. En cada componente compuesto, puede usar ui: fragments para delimitar los componentes que desea incluir por separado en columnas diferentes. Lo siguiente es extracto de mi inputText.xhtml:

                      

Ahora, esto no va a alinearse en el formulario que está dentro de panelGrid:

     

Así que extendí el método encodeRecursive de GroupRenderer para agregar después de la etiqueta y un campo anterior:

 // inside my extended renderer protected void encodeRecursive(FacesContext context, UIComponent component) throws IOException { // Render our children recursively if (component instanceof ComponentRef && component.getId().equals("field")) { context.getResponseWriter().startElement("td", component); } super.encodeRecursive(context, component); if (component instanceof ComponentRef && component.getId().equals("label")) { context.getResponseWriter().endElement("td"); } }