Erro ao inicializar cores nos dados de uma Datatable utilizando HashMap

6 respostas
C

Bom galera estou com um pequeno problema, tenho uma matriz que utilizo um hashmap, o problema que está ocorrendo é que preciso que na pagina os dados dessa matriz varie de cor de acordo com a situação, utilizei o a anotaçao @Transient, segue o codigo abaixo do metodo:

@Transient
	public int getCorMatriz(){
		int y = 4;		
		for (Reservas r: listaReserva) {
			if(r.getSituacao().equalsIgnoreCase("Cliente está no hotel")){
				y = 0;
				//return y;
			} else if(r.getSituacao().equalsIgnoreCase("Reserva confirmada")){
				y = 1;
				//return y;
			} else if(r.getSituacao().equalsIgnoreCase("Pré-reserva faltando deposito")){
				y = 3;
				//return y;
			} else if(r.getSituacao().equalsIgnoreCase("Já fez check out")){
				y = 4;				
				//return y;
			}
		}		
	
		return y;
	}

O que está acontencendo qnd descomento os return ele pega o 1 que acha e seta pra todos, e quando deixo o return no final ele retorna o ultimo q ele pega. Segue a pagina abaixo

<p:dataTable value="#{orcamentoBean.quarto}" var="cat" bgcolor="#FFFFFF" id="teste" style="max-width: 550px; min-width: 550px">
			<p:column style="max-width: 50px; min-width: 30px">
				<f:facet name="header">Quarto</f:facet>
				<h:outputText value="#{cat}" />				
			</p:column>
			<c:forEach var="mes" items="#{orcamentoBean.dia}">
				<p:column style="max-width: 80px; min-width: 30px; overflow: hidden">
					<f:facet name="header">#{mes}</f:facet>
					    <h:outputText value="#{orcamentoBean.valores[cat][mes]}" style="color:Green" rendered="#{orcamentoBean.corMatriz == 0}" >
					    	<f:attribute name="cat" value="#{cat}"/>
					    	<f:attribute name="mes" value="#{mes}"/>
						</h:outputText>
						<h:outputText value="#{orcamentoBean.valores[cat][mes]}" style="color:#FFD700" rendered="#{orcamentoBean.corMatriz == 1}" >
							<f:attribute name="cat" value="#{cat}"/>
					    	<f:attribute name="mes" value="#{mes}"/>
						</h:outputText>
						<h:outputText value="#{orcamentoBean.valores[cat][mes]}" style="color:Red" rendered="#{orcamentoBean.corMatriz == 3}" >
					    	<f:attribute name="cat" value="#{cat}"/>
					    	<f:attribute name="mes" value="#{mes}"/>
						</h:outputText>
						<h:outputText value="#{orcamentoBean.valores[cat][mes]}" style="color:Blue" rendered="#{orcamentoBean.corMatriz == 2}" >
					    	<f:attribute name="cat" value="#{cat}"/>
					    	<f:attribute name="mes" value="#{mes}"/>
						</h:outputText>
						<h:outputText value="#{orcamentoBean.valores[cat][mes]}" rendered="#{orcamentoBean.corMatriz == 4}" >
					    	<f:attribute name="cat" value="#{cat}"/>
					    	<f:attribute name="mes" value="#{mes}"/>
						</h:outputText>
				</p:column>				
			</c:forEach>
		</p:dataTable>

Queria saber se tem algum outro metodo pra fazer isso ou se estou errando em alguma coisa, desde já agradeço a ajuda.

6 Respostas

Hebert_Coelho

Cara, existe sim:
Ao invés de fazer isso aqui: r.getSituacao().equalsIgnoreCase(“Cliente está no hotel”)
faça apenas
private static final String CLIENTE_NO_HOTEL = “CLIENTE_NO_HOTEL”; // salve assim no DB
r.getSituacao().equals(CLIENTE_NO_HOTEL);// a comparação fica objetiva, direta e com menos chance de erro.

No seu managedBean, crie métodos tipo

public boolean isClienteNoHotel(){

return r.getSituacao().equals(CLIENTE_NO_HOTEL);

}

Com isso, você teria um IF para cada caso, e ficaria mais fácil de refatorar depois.
C

jakefrog:
Cara, existe sim:
Ao invés de fazer isso aqui: r.getSituacao().equalsIgnoreCase(“Cliente está no hotel”)
faça apenas
private static final String CLIENTE_NO_HOTEL = “CLIENTE_NO_HOTEL”; // salve assim no DB
r.getSituacao().equals(CLIENTE_NO_HOTEL);// a comparação fica objetiva, direta e com menos chance de erro.

No seu managedBean, crie métodos tipo

public boolean isClienteNoHotel(){

return r.getSituacao().equals(CLIENTE_NO_HOTEL);

}

Com isso, você teria um IF para cada caso, e ficaria mais fácil de refatorar depois.</blockquote>

Bom segui seu conselho e andou bastante, porém ele está dando o seguitne erro, ele acaba repetindo todos os dados na mesma coluna e linha com cada valor de uma cor diferente. Quebrei o método inicicial em 5 pra cada situação.

Ele tem que mostrar algo assim +ou-: na linha 1 tem 4 dados cada um em uma coluna separada no meu caso os dias do mes, dependendo da situação esse dado pode aparecer azul, vermelho, verde ou preto segue a alteraão q fiz na pagina

<h:outputText value="#{orcamentoBean.valores[cat][mes]}" style="color:Green" rendered="#{orcamentoBean.clienteNoHotel == 0}" >  
                            <f:attribute name="cat" value="#{cat}"/>  
                            <f:attribute name="mes" value="#{mes}"/>  
                        </h:outputText>  
                        <h:outputText value="#{orcamentoBean.valores[cat][mes]}" style="color:#FFD700" rendered="#{orcamentoBean.reservaConfirmada == 1}" >  
                            <f:attribute name="cat" value="#{cat}"/>  
                            <f:attribute name="mes" value="#{mes}"/>  
                        </h:outputText>  
                        <h:outputText value="#{orcamentoBean.valores[cat][mes]}" style="color:Red" rendered="#{orcamentoBean.reservaNaoConfirmada == 2}" >  
                            <f:attribute name="cat" value="#{cat}"/>  
                            <f:attribute name="mes" value="#{mes}"/>  
                        </h:outputText>  
                        <h:outputText value="#{orcamentoBean.valores[cat][mes]}" style="color:Blue" rendered="#{orcamentoBean.checkOut == 3}" >  
                            <f:attribute name="cat" value="#{cat}"/>  
                            <f:attribute name="mes" value="#{mes}"/>  
                        </h:outputText>  
                        <h:outputText value="#{orcamentoBean.valores[cat][mes]}" rendered="#{orcamentoBean.noShow == 4}" >  
                            <f:attribute name="cat" value="#{cat}"/>  
                            <f:attribute name="mes" value="#{mes}"/>  
                        </h:outputText>
Hebert_Coelho

C não fez igual eu falei! =P

#{orcamentoBean.clienteNoHotel == 0}

eu fiz com o método retornando boolean, deveria ser apenas:
#{orcamentoBean.clienteNoHotel}

Você não precisa fazer == na sua página se seu método retornar um boolean.

C

jakefrog:
C não fez igual eu falei! =P

#{orcamentoBean.clienteNoHotel == 0}

eu fiz com o método retornando boolean, deveria ser apenas:
#{orcamentoBean.clienteNoHotel}

Você não precisa fazer == na sua página se seu método retornar um boolean.

Opa erro meu esqueci de alterar o metodo pra boolean, agora está alterado e mesmo assim ele continua repetindo os dados na mesma coluna, quando deixo apenas 1 output na página ele preenche certo com aquela cor porem quando coloco as outras ele repete os dados com as 4 cores

Segue o metodo que fiz separadamente:

@Transient
	public boolean isEstaNoHotel(){		
		for (Reservas r: listaReserva) {
			if(r.getSituacao().equals(CLIENTE_NO_HOTEL)){	
				return r.getSituacao().equals(CLIENTE_NO_HOTEL);
			}
		}		
	
		return false;
	}
	
	@Transient
	public boolean isReservaConfirmada(){
		for (Reservas r: listaReserva) {
			if(r.getSituacao().equals(RESERVA_CONFIRMADA)){
				return r.getSituacao().equals(RESERVA_CONFIRMADA);
			}
		}
		return false;
	}
	
	@Transient
	public boolean isReservaNaoConfirmada(){
		for (Reservas r: listaReserva) {
			if(r.getSituacao().equals(RESERVA_FALTANDO_DEPOSITO)){
				y = 3;
				return r.getSituacao().equals(RESERVA_FALTANDO_DEPOSITO);
			}
		}		
	
		return false;
	}
	
	@Transient
	public boolean isCheckOutFeito(){
		for (Reservas r: listaReserva) {
			if(reserva.getSituacao().equals(CHECKOUT)){
				return reserva.getSituacao().equals(CHECKOUT);
			}
		}		
	
		return false;
	}
	
	@Transient
	public boolean isNoShow(){		
		for (Reservas r: listaReserva) {
			if(r.getSituacao().equals(NO_SHOW)){
				return r.getSituacao().equals(NO_SHOW);
			}
		}		
	
		return false;
	}

Tentei alterar pra true o return e o erro persiste também.

Hebert_Coelho

Pq o @Transient?

O mesmo cara que você está persistindo no banco é o mesmo cara que você declarou como managedBean?

C

jakefrog:
Pq o @Transient?

O mesmo cara que você está persistindo no banco é o mesmo cara que você declarou como managedBean?

Sim é o mesmo cara. Desculpa a demora, to procurando alguma solução aqui pois creio que o erro ta sendo de lógica no método já que to notando que ele qnd vai pra página entra mais de uma vez no método

Criado 24 de janeiro de 2012
Ultima resposta 25 de jan. de 2012
Respostas 6
Participantes 2