[RESOLVIDO]JSF: Problema ao passar string vazio para uma célula de um dataTable

Olá pessoal!
Tenho um dataTable (myfaces) que tem uma coluna que, na minha lógica de negócio, pode exibir string vazio. O problema é o seguinte: Quando meu backing bean passa um string vazio para uma determinada célula da tabela, esta celula aparentemente não é renderizada, ficando um “buraco” no meio databela. Olhe a figura anexada.
Cheguei até a criar um converter que troca “” por " ", porém o dataTable deve ter uma inteligência(?) tal que detecta que só há espaços no valor campo e não o renderiza.
DETALHE: Talvez seja importante informar que a célula em questão recebe um output text, o quel, por sua vez, recebe o string vazio.
Gostaria de saber se os colegas imaginam uma forma de contornar este problema.

Valeu!

Cara se tiver como posta o código que fica mais fácil para o pessoal analizar seu problema.

Isso me parece mais problema de CSS do que do componente :slight_smile: Você já examinou o código HTML gerado?

Tente colocar o rendered=“true”, talvez funcione!

Vai aí o código jsp da tabela:

<t:dataTable var="atributo" value="#{lanctosManuaisBean.dadosManutAtributos.atributos}"
	rowIndexVar="i" cellpadding="0" cellspacing="0" styleClass="tablePadrao"
	headerClass="tableHeaderCenter" columnClasses="tableColumn" rowClasses="tableRowRadio">
	<t:column headeronmouseover="this.className='tableHeaderCenterMouseOver'"
		headeronmouseout="this.className='tableHeaderCenter'">
		<f:facet name="header">
			<t:outputText onmouseover="" value="&nbsp;" escape="false" />
		</f:facet>
		<t:radio for=":manutAtribForm:rdgAtribs" index="#{i}" />
	</t:column>
	<t:column headeronmouseover="this.className='tableHeaderCenterMouseOver'"
		headeronmouseout="this.className='tableHeaderCenter'">
		<f:facet name="header">
			<t:outputText styleClass="HtmlDataTableBold"
				value="#{msgs.label_atributo}" escape="false" />
		</f:facet>
		<t:outputText styleClass="HtmlDataTable"
			value="#{atributo.codAtributo}" escape="false" />
	</t:column>
	<t:column headeronmouseover="this.className='tableHeaderCenterMouseOver'"
		headeronmouseout="this.className='tableHeaderCenter'">
		<f:facet name="header">
			<t:outputText styleClass="HtmlDataTableBold"
				value="#{msgs.label_conteudo}" escape="false" />
		</f:facet>
		<t:outputText styleClass="HtmlDataTable"
			converter="emptyAsSpaceConverter" value="#{atributo.conteudoAtributo}" escape="false" />
	</t:column>
	<t:column headeronmouseover="this.className='tableHeaderCenterMouseOver'"
		headeronmouseout="this.className='tableHeaderCenter'">
		<f:facet name="header">
			<t:outputText styleClass="HtmlDataTableBold"
				value="#{msgs.label_situacao_atri}" escape="false" />
		</f:facet>
		<t:outputText styleClass="HtmlDataTable"
			value="#{atributo.codSituacaoAtributo}" escape="false" />
	</t:column>
</t:dataTable>

Note que tentei criar um converter e associá-lo ao outputText que exibe os valores da coluna conteúdo.
Aqui vai o fonte do converter (Bem inocente):

public class EmptyAsSpaceConverter implements Converter {

	public EmptyAsSpaceConverter() {
	}

	public Object getAsObject(FacesContext fc, UIComponent comp, String value) throws ConverterException {
		try {
			if (value.matches("\\s+")) {
				return value.trim();
			}
			return value;
		} catch (Exception e) {
			throw new ConverterException(e);
		}
	}

	public String getAsString(FacesContext fc, UIComponent comp, Object value) throws ConverterException {
		try {
			String result = value.toString();
			if (result.length() > 0) {
				return result;
			}
			return " ";
		} catch (Exception e) {
			throw new ConverterException(e);
		}
	}

}

[quote=rponte]
Isso me parece mais problema de CSS do que do componente :slight_smile: Você já examinou o código HTML gerado?[/quote]
Examinei. O span aparece lá, porém as bordas definidas na classe tableColumn são simplesmente ignoradas.
Aqui vai o HTML resultante, seguido das classes de estilo:

<t:dataTable var="atributo" value="#{lanctosManuaisBean.dadosManutAtributos.atributos}"
	rowIndexVar="i" cellpadding="0" cellspacing="0" styleClass="tablePadrao"
	headerClass="tableHeaderCenter" columnClasses="tableColumn" rowClasses="tableRowRadio">
	<t:column headeronmouseover="this.className='tableHeaderCenterMouseOver'"
		headeronmouseout="this.className='tableHeaderCenter'">
		<f:facet name="header">
			<t:outputText onmouseover="" value="&nbsp;" escape="false" />
		</f:facet>
		<t:radio for=":manutAtribForm:rdgAtribs" index="#{i}" />
	</t:column>
	<t:column headeronmouseover="this.className='tableHeaderCenterMouseOver'"
		headeronmouseout="this.className='tableHeaderCenter'">
		<f:facet name="header">
			<t:outputText styleClass="HtmlDataTableBold"
				value="#{msgs.label_atributo}" escape="false" />
		</f:facet>
		<t:outputText styleClass="HtmlDataTable"
			value="#{atributo.codAtributo}" escape="false" />
	</t:column>
	<t:column headeronmouseover="this.className='tableHeaderCenterMouseOver'"
		headeronmouseout="this.className='tableHeaderCenter'">
		<f:facet name="header">
			<t:outputText styleClass="HtmlDataTableBold"
				value="#{msgs.label_conteudo}" escape="false" />
		</f:facet>
		<t:outputText styleClass="HtmlDataTable"
			converter="emptyAsSpaceConverter" value="#{atributo.conteudoAtributo}" escape="false" />
	</t:column>
	<t:column headeronmouseover="this.className='tableHeaderCenterMouseOver'"
		headeronmouseout="this.className='tableHeaderCenter'">
		<f:facet name="header">
			<t:outputText styleClass="HtmlDataTableBold"
				value="#{msgs.label_situacao_atri}" escape="false" />
		</f:facet>
		<t:outputText styleClass="HtmlDataTable"
			value="#{atributo.codSituacaoAtributo}" escape="false" />
	</t:column>
</t:dataTable>


.HtmlDataTable{font-family: verdana; font-size: 10px}
.tableRowRadio {
	background-color:#FFFFFF;
	padding-bottom: 6px;
	padding-top: 6px;
	padding-right: 6px;
	padding-left: 6px;
	border-right: solid #C6C6CB 1px;	
	border-bottom: solid #C6C6CB 1px;
}
.tableColumn {
	border-right: solid #C6C6CB 1px;	
	border-bottom: solid #C6C6CB 1px;
}




Enquanto estava respondendo aqui, parei e fiz um teste, e acabei por constatar que isso é comportamento do próprio html! Ele não renderiza a TD se seu conteudo for vazio. Associado a isso, temos que se escrevermos espaços dentro do span ou div, ele é “trimado”(argh!), ficando vazio e, consequentemente, não renderizando a TD.
A solução que achei foi mexer no converter para que, ao invés de mandar um " ", mandar um " ", que é a entidade html do espaço. Quando passo isso, ele não “trima”(urgh!) o conteúdo da SPAN e renderiza a célula!!!.

Muito obrigado a todos pelas idéias!

Mantu - O que vc quis dizer com isso, tenho um problema semelhante, onde quero obrigar a impressão de múltiplos espaços num outputText. Como exatamente vc fez ? :lol: