Richfaces rich:comboBox não mostra label

12 respostas
C

Galera minha rich:combobox estã mostrando o value ao inves do label... alguém sabe pq ?

@Name("alertaHandler")
@Scope(ScopeType.SESSION)
public class AlertaHandler {

	private Alerta alerta ;

	private IDao<Defeito> daoDefeito ;
	
	@NotEmpty
	private String descricao ;
	
	@NotEmpty
	private String defeito ;
	
	private List<SelectItem> defeitos ;
	
	@PostConstruct
	public void initialize(){
		
		try {
			InitialContext initialContext = new InitialContext();
			daoDefeito = (IDao<Defeito>) initialContext.lookup("xnocp-ear/DaoImpl/remote");
		} catch (NamingException e) {
			e.printStackTrace();
		}
		
		carregaDefeitos();
		
	}

	public void carregaDefeitos(){
		
		List<Defeito> listaDefeitos = daoDefeito.pesquisar(new Defeito());
		
		defeitos = new ArrayList<SelectItem>();
		
		for (Defeito defeito : listaDefeitos){
			SelectItem selectItem = new SelectItem();
			
			selectItem.setLabel(defeito.getDes_defeito());
			selectItem.setValue(defeito.getDefeitoPK().getCod_defeito());
			
			defeitos.add(selectItem);
		}
		
	}
<rich:comboBox  selectFirstOnUpdate="true"  value="#{alertaHandler.defeito}" id="defeito" width="200" required="true" requiredMessage="#{msgs['defeito_vazio']}">
					<f:selectItems value="#{alertaHandler.defeitos}"/>
					<rich:ajaxValidator event="onblur"/>
				</rich:comboBox>

12 Respostas

thiago.correa

<h:outputLabel value="Nome do campo" for="defeito" />

C

não entendi muito bem… onde eu coloco esse codigo ?

PS: não estou me referindo a label que fica na frente do campo ou em cima… estou falando do conteundo da combox, que tem o value e o label.

thiago.correa

Você criou os métodos getters e setters para a sua propriedade “defeitos”?!

C

Sim, criei.

thiago.correa

Ele não mostra nada, os valores são preenchidos certo?! O que aparece na tela?! Dá uma depurada para ver se a lista que está trazendo do BD está com os objetos devidamente populados.

C

Ja debuguei, a coleção com os objetos é populado certinho, o único problema é que dentro da combobox a inves de aparecer a descrição do defeito, aparece o código.

se eu fizer dessa forma funciona :

<h:selectOneMenu value="#{alertaHandler.defeito}">
					<f:selectItems value="#{alertaHandler.defeitos}"/>
				</h:selectOneMenu>

mas preciso usar os componentes richfaces.

Acredito que seja um bug desse componente, porque veja só aqui eu preparo a coleção de SelectItem

defeitos = new ArrayList<SelectItem>();
		
		for (Defeito defeito : listaDefeitos){
			SelectItem selectItem = new SelectItem();			
			
			selectItem.setLabel(defeito.getDes_defeito());
			selectItem.setValue(defeito.getDefeitoPK().getCod_defeito());
			
			defeitos.add(selectItem);
		}
dessa forma aparece dentro da combobox o código ao inves da descrição, mas se eu inverter dessa forma, a descrição aparece dentro da combobox... certinho, porem qdo der o submit no form não consigo pegar o código do defeito, pq a descrição está no value, onde deveria estar o código.
defeitos = new ArrayList<SelectItem>();
		
		for (Defeito defeito : listaDefeitos){
			SelectItem selectItem = new SelectItem();			
			
			selectItem.setLabel(defeito.getDefeitoPK().getCod_defeito());
			selectItem.setValue(defeito.getDes_defeito());
			
			defeitos.add(selectItem);
		}
thiago.correa

Velho olhando a documentação aparentemente está certo o uso, considere fazer um upgrade de versão para ver se resolve o seu problema, não cheguei a usar o rich:comboBox, vou até fazer um teste mais tarde com ele!

C

É cara… esse erro ta me matando, ja estou com a versão estável mais rescente 3.3.2, vou colocar a 4 pra ver. Mas fico com receio pq não é a versão final ainda ne…
Mas valeu pela força…

thiago.correa

Cara, fui utilizar o combobox do richfaces e realmente vi que ele não mostra o label e sim o valor!

Dando uma cavocada na net achei isso

http://community.jboss.org/message/43656#4172548

C

Eu fiz esse teste também com o seam mas continuou a mesma coisa. Inclusive achei um outro bug, usando aquele rich:datatable com paginação qdo vc clica na coluna pra ordenação ele se perde e não envia o atributo rows e vai -1 pro setMaxResults do JPA…
resumindo… desisti do richfaces… ainda tem muito que amadurecer…
mas valeu pela força…

G

O combo do rich faces não funciona como um combo normal, na verdade ele é uma lista de strings, e nada mais do que isso :

[i] The component provides editable combobox element on the page.

Combo Box is a simplified select based version of Suggestion Box component, which uses

* client side suggestions
* declarative definition with f:selectItem(s) components
[b]* a list of string objects[/b]

When using selectItem(s) for suggestion definition you should define only value of the selectItem. It is used both for displaying and storing[/i]

ou seja, oq você passar pra ele como chave, é oq ele vai exibir como valor tb …

T

Boa noite!

Há algum tempo atrás passei bastante trabalho pra fazer funcionar a ComboBox do RichFaces em um projeto usando JBoss Seam e RichFaces.

Vou te dar o passo-a-passo. No meu projeto aqui funciona certinho:

  1. Implementar uma classe converter conforme código abaixo:
package com.br.tdn.ecclesia.converter;

import java.util.List;

import javax.faces.component.UIComponent;
import javax.faces.component.UISelectItems;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.model.SelectItem;

public class ComboBoxConverter implements Converter {

	public ComboBoxConverter() {
	}

	public Object getAsObject(FacesContext facesContext,
			UIComponent uiComponent, String value) {
		List<SelectItem> items = retrieveSelectItems(uiComponent);
		for (SelectItem si : items) {
			if (si.getLabel().equals(value)) {
				return si.getValue();
			}
		}
		return null;
	}

	public String getAsString(FacesContext facesContext,
			UIComponent uiComponent, Object value) {
		List<SelectItem> items = retrieveSelectItems(uiComponent);
		for (SelectItem si : items) {
			if (si.getValue().equals(value)) {
				return si.getLabel();
			}
		}
		return "";
	}

	@SuppressWarnings("unchecked")
	private List<SelectItem> retrieveSelectItems(UIComponent uiComponent) {
		List<SelectItem> items = null;
		if (!uiComponent.getChildren().isEmpty()
				&& uiComponent.getChildren().get(0) instanceof UISelectItems) {
			items = (List<SelectItem>) ((UISelectItems) uiComponent
					.getChildren().get(0)).getValue();
		}
		return items;
	}

}
  1. Depois, você deve implementar o método que retorna a lista dos itens que vc deseja exibir na ComboBox:
(...)

	@SuppressWarnings("unchecked")
	public List<EstadoCivil> listAllEstadosCivis() {
		return getEntityManager().createQuery(
				"select ec from EstadoCivil as ec order by ec.estadoCivil")
				.getResultList();
	}

(...)
  1. Depois é só colocar o converter na combo:
<s:decorate id="estadoCivilField" template="layout/edit.xhtml">
				<ui:define name="label">#{messages['membro.estadoCivil']}</ui:define>
				<rich:comboBox value="#{membroHome.instance.estadoCivil}"
					selectFirstOnUpdate="false"
					defaultLabel="#{messages['estadoCivil']}"
					required="true"
					converter="converter.ComboBoxConverter">
					<s:selectItems var="_estadoCivil" value="#{membroList.listAllEstadosCivis()}"
						label="#{_estadoCivil.estadoCivil}"/>
					<a:support event="onselect" reRender="estadoCivilField,nomeConjugeField"
						bypassUpdates="true" ajaxSingle="true" />
				</rich:comboBox>
			</s:decorate>

Acho que é isso…

Deus abençoe!

Criado 4 de janeiro de 2010
Ultima resposta 16 de mar. de 2012
Respostas 12
Participantes 4