SelectOneMenu

Boa noite pessoal!!

Estou tendo problemas para carregar dados em um selectOneMenu, estou fazendo um exercício da apostila da K19, segui os passo certinhos mas não consigo fazer com que os dados sejam exibidos.

Meu ManagedBean


import java.util.HashMap;
import javax.annotation.ManagedBean;



@ManagedBean
public class ConversorMonetarioBean {
	private String de;
	private String para;
	private double valor;	

	private double resultado;

	public  HashMap<String, Double> taxas = new HashMap<String, Double>();

	
	
	public ConversorMonetarioBean(){
		this.taxas.put("Real", 1.0);
		this.taxas.put("Euro", 2.33);
		this.taxas.put("Peso argentino", 0.42);
		this.taxas.put("Dolar Americano", 1.84);
	}
	
	
	
	public void converte(){
		
		this.resultado = this.valor * this.taxas.get(this.de) / this.taxas.get(this.para); 
	}



	public String getDe() {
		return de;
	}



	public void setDe(String de) {
		this.de = de;
	}



	public String getPara() {
		return para;
	}



	public void setPara(String para) {
		this.para = para;
	}



	public double getValor() {
		return valor;
	}



	public void setValor(double valor) {
		this.valor = valor;
	}



	public double getResultado() {
		return resultado;
	}



	public void setResultado(double resultado) {
		this.resultado = resultado;
	}



	public HashMap<String, Double> getTaxas() {
		return taxas;
	}



	public void setTaxas(HashMap<String, Double> taxas) {
		this.taxas = taxas;
	}



}

Meu arquivo xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core">

<h:head>
<title>K19 Treinamentos</title>
</h:head>

<h:body>
	<h:form>
		<h:commandButton value="Converter" action="#{conversorMonetarioBean.converte}" />		
		
		<h:inputText value="#{conversorMonetarioBean.valor}"/>
		
		<h:outputLabel value="De:" for="de"/>
		
		<h:selectOneMenu value="#{conversorMonetarioBean.de}" id="de">						
			<f:selectItems
				value="#{ConversorMonetarioBean.taxas.KeySet()}"
				var="moeda"
				itemValue="#{moeda}"
				itemLabel="#{moeda}"/> 
		</h:selectOneMenu>
		
		<h:outputLabel value="Para: " for="para"/>
		
		<h:selectOneMenu value="#{conversorMonetarioBean.para}" id="para">
			<f:selectItems
			value="#{ConversorMonetarioBean.taxas.KeySet()}"
				var="moeda"
				itemValue="#{moeda}"
				itemLabel="#{moeda}"/>						
		</h:selectOneMenu>		
	</h:form>	
	Resultado: #{conversorMonetarioBean.resultado}
</h:body>
</html>

Na apostila não é mencionado se é preciso realizar alguma implementação no método getTaxas!!

Já pesquisei em outros posts aqui do fórum e em outros sites, mas nenhum diz se há a necessidade de criar uma função a qual seria vinculada ao selectOneMenu.

Agradeço à todos pelo ajuda!

Porque você não tenta utilizar um List de um objeto Taxa? Nele teria o codigo, e o nome da taxa. Bem mais fácil, e politicamente correto.

Ficaria assim:

&lt;h:selectOneMenu value="#{conversorMonetarioBean.para}" id="para"&gt; &lt;f:selectItems value="#{ConversorMonetarioBean.taxas}" var="moeda" itemValue="#{moeda.codigo}" itemLabel="#{moeda.nome}"/&gt; &lt;/h:selectOneMenu&gt;

Olá amigo!!

Obrigado pela dica! Vc está dizendo para eu utilizar essa List no lugar do HashMap e passar como parâmetro os atributos double e String?

Ou no caso seria criar uma classe taxa com esses dois atributos, e na classe bean criar esse List passando como parâmetro a taxa?

Valew pela ajuda

Sim amigo, o essencial é que cries um Objeto chamado Taxa onde terá o double e o string. E passalo na list, para o selectOneMenu receber.

Daí, irá ficar assim:

&lt;h:selectOneMenu value="#{conversorMonetarioBean.para}" id="para"&gt; &lt;f:selectItems value="#{ConversorMonetarioBean.taxas}" var="moeda" itemValue="#{moeda}" itemLabel="#{moeda.nome}"/&gt; &lt;/h:selectOneMenu&gt;

Veja como fiz acima, eu disse que o usuário iria ver ( itemLabel ), o nome da moeda, mas eu irei estar passando ( itemValue ) para o meu managedBean a Moeda em si. No caso o seu atributo para teria de ser do tipo Taxa.

Lembrando que, quando fazemos este tipo de operação no Jsf, temos que implementar um Converter ( esse cara serve para o JSF entender o que danado que ele está recebendo ao usuário selecionar a “Taxa”, irei passar a baixo um exemplo de converter que utilizo em meus projetos:

[code]
@FacesConverter(value = “taxaConverter”, forClass = Taxa.class)
public class TaxaConverter implements Converter {

@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String value)
		throws ConverterException {
	if (value != null && value.equals("")) {
		Taxa taxa = new Taxa();
		taxa = taxaService.buscarPorId(Long.parseLong(value));//Aqui vc implementa um metodo para buscar a taxa por Id, seja num banco de dados, ou em algum map estatico.
		return taxa;
	} else {
		return null;
	}
}

@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object object)
		throws ConverterException {
	try {
		if (!object.equals(new Taxa())) {
			return ((Taxa) object).getId().toString();
		}

	} catch (ConverterException e) {
		e.printStackTrace();
	}
	return null;

}

}[/code]

Daí, agora vc modifica seu selectOneMenu, adicionando o converter “taxaConverter” no atributo, converterId;

Valew amigo!

Estou tentado aqui, assim que conseguir darei um toq!

Abraço!