Problema Enum

12 respostas
M

Bom dia, estou tentando carregar algumas combos aqui pelo enum, mais não estou conseguindo traduzir a chave do properties, como eu faço isso?
Vou postar partes enum, meu managed bean, e do arquivo xhtml!

ENUM:

public enum TipoDocumento {
	
	/**
	 * Documento de Entrada
	 */
	ENTRADA((byte) 0, "Entrada", "tipodocumento.entrada"),

	/**
	 * Documento de Saída
	 */
	SAIDA((byte) 1, "Saída", "tipodocumento.saida");
	
	/**
	 * Código.
	 */
	private byte codigo;
	
	/**
	 * Descrição. 
	 */
	private String descricao;
	
	/**
	 * Chave properties.
	 */
	private String chave;

	/**
	 * Construtor
	 *
	 * @param codigo
	 * @param descricao
	 * @param chave
	 */
	private TipoDocumento(byte codigo, String descricao, String chave) {
		this.codigo = codigo;
		this.descricao = descricao;
		this.chave = chave;
	}
	
	/**
	 * Método para retornar a lista de tipos de documentos.
	 *
	 * @return - Lista de tipos de documentos.
	 */
	public static List<TipoDocumento> getLista(){
		List<TipoDocumento> lista = new ArrayList<TipoDocumento>();
		
		lista.add(ENTRADA);
		lista.add(SAIDA);
		
		return lista;
	}
	
	/**
	 * Método para pegar um tipo a partir de um código.
	 *
	 * @param codigo
	 * @return
	 */
	public static TipoDocumento getTipo(byte codigo){
		
		for (TipoDocumento tipo : getLista()){
			if (tipo.getCodigo() == codigo){
				return tipo;
			}
		}
		
		return null;
	}
	
	/**
	 * Método acessor para obter o valor do atributo codigo.
	 *
	 * @return Retorna o atributo codigo.
	 */
	public byte getCodigo() {
		return codigo;
	}

	/**
	 * Método acessor para obter o valor do atributo descricao.
	 *
	 * @return Retorna o atributo descricao.
	 */
	public String getDescricao() {
		return descricao;
	}

	
	/**
	 * Método acessor para obter o valor do atributo chave.
	 *
	 * @return Retorna o atributo chave.
	 */
	public String getChave() {
		return chave;
	}
MANAGED BEAN:
/**
	 * Construtor
	 *
	 */
	public NotaFiscalControle() {
		super();
		tipoDocumento.addAll(TipoDocumento.getLista());
        }

XHTML:

<h:panelGrid>
	<h:outputLabel value="#{msgs['notas.fiscais.tipo.documento']}" styleClass="label" for="idTipoDocumento" />
		<rich:select id="idTipoDocumento" enableManualInput="true" styleClass="comboTipoDocumento">
			<f:selectItems value="#{notaFiscalControle.tipoDocumento}" var="item" itemLabel="#{item.chave}" itemValue="#{item.codigo}" />
		</rich:select>
</h:panelGrid>

O que devo fazer para que o enum possa traduzir a chave do properties??
Porque na tela não sai "Entrada", "Saída", saí "tipodocumento.entrada" e "tipodocumento.saida" !!

Ajuda, please?
Obrigada!

12 Respostas

drsmachado

Que tal ajudar-nos a te ajudar e postar o código nas tags [code]?

Rodrigo_Sasaki

Onde está o construtor do Enum?

por favor, edite seu post e insira o código entre as tags

M

Melhorou, desculpem esqueci de colocar !!!

Rodrigo_Sasaki

veja o que você fez: ENTRADA((byte) 0, "Entrada", "tipodocumento.entrada");0 - codigo
“Entrada” - descricao
“tipodocumento.entrada” - chave.

Isso de acordo com seu construtor:private TipoDocumento(byte codigo, String descricao, String chave) { this.codigo = codigo; this.descricao = descricao; this.chave = chave; } portanto se você quer que apareça a descrição, não deve colocar a chave no itemLabel do seu rich:select

L

O que é exibido no combo é o

itemLabel="#{item.chave}"

no seu caso “tipodocumento.entrada” ou “tipodocumento.saida”.
Mude para

itemLabel="#{item.descricao}"
M

Eu sei disso digaoneves, mais eu quero que pegue o valor que está na chave la na classe app.properties !

Não quer que pegue da Descrição do enum, pq assim a chave nem seria usada aqui eu poderia apenas colocar assim:

public enum TipoDocumento {
	
	/**
	 * Documento de Entrada
	 */
	ENTRADA((byte) 0, "Entrada"),

	/**
	 * Documento de Saída
	 */
	SAIDA((byte) 1, "Saída");

Entendeu o que quero dizer?
Eu quero saber como faz para que o enum traduza o que está no app.properties e jogue na combo !

L

Vc tá mexendo com i18n?

Vamos supor que seu app.properties esteja configurado no faces-config.xml como msg, e nele tenha a propriedade ‘tipodocumento.entrada’.

Então basta fazer assim:

<f:selectItems value="#{notaFiscalControle.tipoDocumento}" var="item" itemLabel="#{msg[item.chave]}" itemValue="#{item.codigo}" />
M

Assim funciona, mais de forma errada, pq ele ñ exerga o código, nem a descrição, e nem a chave, dai ele pega e põe na tela ENTRADA e SAÍDA em maiúsculas , e não usa a chave do app.properties que está escrito Entrada e Saída em minúsculas, entendeu?

Rodrigo_Sasaki

como se você está buscando um atributo de um bundle?

aonde estão esses valores ENTRADA e SAÍDA em maiúsculo ?

M

Os valores estão no Enum:

[b] ENTRADA[/b]((byte) 0, "Entrada", "tipodocumento.entrada");

Então eu não to usando nada p chamar um atributo bundle, tem que usar o f:bundle?

Rodrigo_Sasaki

Você nem testou a sugestão do lsjunior ?

[quote=lsjunior]Vc tá mexendo com i18n?

Vamos supor que seu app.properties esteja configurado no faces-config.xml como msg, e nele tenha a propriedade ‘tipodocumento.entrada’.

Então basta fazer assim:

<f:selectItems value="#{notaFiscalControle.tipoDocumento}" var="item" itemLabel="#{msg[item.chave]}" itemValue="#{item.codigo}" />
M

Eu coloquei assim funcionou, mais no item fica dando esse erro aqui: “item” cannot be resolved

<f:selectItems value="#{notaFiscalControle.tipoDocumento}" var="item" itemLabel="#{msgs[item.chave]}" itemValue="#{item.codigo}" />

Mais esse erro não está interferindo, só fica aquele risco amarelo em baixo do item, mais valeu pela ajuda !
Abraço.

Criado 16 de julho de 2012
Ultima resposta 16 de jul. de 2012
Respostas 12
Participantes 4