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

5 respostas
Mantu

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!

5 Respostas

P

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

rponte

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

e-cowboy

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

Mantu

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);
		}
	}

}

rponte:

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

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!

R

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:

Criado 15 de maio de 2008
Ultima resposta 7 de nov. de 2008
Respostas 5
Participantes 5