Rich:comboBox - tem bug mesmo?

27 respostas
alias

Caros amigos de fórum…
conto com sua sabedoria novamente para tomar uma decisao em relação ao meu projeto.

Estou utilizando o rich:combobox em um projeto jsf que estou desenvolvendo. Conforme já vi o depoimento de outros camaradados do forum o maldito componente nao mostra o label de cada item da combo, e sim o que deveria ser o seu valor oculto. Pelo menos quando utilizando com f:selectItems e preenchido com uma coleção de objetos SelectItem. :evil:

Fiz muitas gambiarras lamentáveis para contornar esse problema. Mas usar o rich:combo, que é bonitinho, está me dando muito trabalho.Portanto, pergunto: isso é realmente um bug do componente?estou utilizando errado?

Vi uma outra forma de se usar o componente (ainda nao testei, mas o farei com urgencia) que é preencher uma collection da classe x e jogar no suggestionValues do componente, depois sobrescrever os métodos equals e toString …alguem já usou dessa forma?

Sinceramente, se nao resolver essa joça vou arrancar esse componente do projeto.

Muito obrigado a todos novamente!!!

27 Respostas

M

Cara bug nao eh, pq ja usei ele, entao provavelmente vc ta fazendo errado, agora pra ter certeza, era bom postar como tu fez ne. Abraçs

alias

é,mal nao faz :D…não tô com o fonte a mão mas o cenário é o seguinte

esse é o cara que que eu quero listar na combo

public class Entidade{
     
    private int id;
	
    private String descricao;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
}

o nosso amigao managerBean…

import javax.faces.model.SelectItem;

public class ManagerBean{
         
    private ArrayList<SelectItem> list;

    public void setList(ArrayList<SelectItem> list){
        this.list = list;
    }
    
    public ArrayList<SelectItem> getList getList(){
        return list;
    }
    
    public void consultaEntidades(){
         ArrayList<Entidade> x  = DAO.consultaEntidades();
         
         list = new ArrayList<SelectItem>();
         
         for (Iterator<Entidade> i = x.iterator(); i.haxNext();){
    		
            Entidade = i.next();
            
            //no construtor do SelectItem passo o id como Value, e a descrição como Label
         	list.add(new SelectItem(i.getId(), i.getDescricao);
         	
         	/*tentei assim tambem
         	SelectItem s = new SelectItem();
         	s.setValue(i.getId());
         	s.setLabel(i.getDescricao());
         	list.add(s);
         	*/
                  
         }
    }
         
}

e na página .jsp…

...

	<rich:comboBox defaultLabel="Selecione...">
		<f:selectItems value="#{managerBean.list}" />					
	</rich:comboBox>

...

foi assim que eu fiz…difere em algo de voce?

muito obrigado!!!

Michel_Sancovich

kra, estou com o mesmo problema que vc, quero gerar um combobox, porem a unica diferenca é que ele tem que ser auto completado ( ex: http://jsfunit.demo.jboss.com/jboss-jsfunit-examples-richfaces/richfaces/suggestionBox.jsf;jsessionid=0DA931BD7BCDA48FACCF80068FE5A762 ).

Eu já fiz funcionar sem o suggestionBox, segue o exemplo abaixo e vê se é o que vc quer:

<rich:tabPanel> <rich:tab label="Selecione o Tipo"> <h:selectOneMenu> <s:selectItems value="#{tipoList.resultList}" var="tipo" label="#{tipo.nome}" noSelectionLabel="Lista de Tipos" /> </h:selectOneMenu> <div class="actionButtons"><s:button value=" Selecionar " view="/TipoList.xhtml"> <f:param name="from" value="ProdutoEdit" /> </s:button></div> </rich:tab> </rich:tabPanel>

Espero ter ajudado e aguardo um help tb.

alias

velho,valeu pela força,mas acho que o seu código nao me serve, porque voce está usando o h:selectOneMenu. Se bem que se o rich:combo nao rolar, vou de h:selectOneMenu mesmo,hehehe…mas ele funciona de boa mesmo

com relação ao autocomplete, esse componente infernal que eu estou questionando, o rich:combobox, já tem o autocomplete por default

Michel_Sancovich

Intao, por isto que eu falei que estou no mesmo barco que vc.
Porem não posso usar o selectOneMenu…

TEM Q SER algum com autoComplete… hehehehe

alias

pois é…tamos no mesmo barco furado,rsrsrs

o jeito é rezar pra alguem já ter feito isso funcionar,e que o mesmo veja esse topico!!!rsrs

além da que mostrei no código,vi uma segunda forma de usar o componente,usando suggestionValues…ainda nao testei, mas quem sabe hoje vai!!!

Michel_Sancovich

O com sugestion Values eu fiz funcionar, porém ele é estático, e preciso de pegar os valores do banco mesmo…

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:rich="http://richfaces.org/rich">
      
      <rich:comboBox defaultLabel="Enter some value">
            <f:selectItem itemValue="suggestion 1"/>
            <f:selectItem itemValue="suggestion 2"/>
            <f:selectItem itemValue="suggestion 3"/>
            <f:selectItem itemValue="suggestion 4"/>
            <f:selectItem itemValue="suggestion 5"/>
      </rich:comboBox>
      
            
</ui:composition>
alias

eu digo usar assim:

...
<rich:combobox defaultLabel="Selecione..." suggestionValues="#{managerBean.list}">
</rich:combobox>
...

no seu managerBean voce consulta o banco, carrega uma collection e joga nessa propriedade.
vi um exemplo desse jeito no proprio src do RichFaces. No exemplo, tambem foram sobrepostos os métodos equals e toString da classe que irá compor a collection. O toString, imagino que seja para definir qual será o texto exibido na combo.
Como disse ainda nao testei esse cara. Mas pretendo faze-lo logo!

Michel_Sancovich

Testae, pq tenho que fazer o mais rapido possivel…

vlw!!!

alias

o meu tambem é pra ontem…vou testar hoje a noite e dou um feedback aqui no topico

a nao ser que alguem apareça primeiro com a solução :slight_smile:

valeu,caras

M

alias, eu nao tenho certeza, mais em vez de usar um ArrayList tipado, use um array de SelectItem[], eu se nao me engano usava assim. Outra coisa, verifica se o objeto que ta vindo da dao, ta vindo com os valores setados certinhos, descricao e id. Tenta-ae e da um feedback. Vlw

alias

Usando um array de SelectItem[]?vixi…rs.valeu pela dica,vou testar sim…brigadao!Mas onde coloco esse array, jogo ele em qual propriedade do componente?

testei tambem usando o suggestionvalues do componente, passando um ArrayList tipado…nao resolveu!rsrsrs

de qualquer forma, se alguem quiser usar assim ao inves de usar o f:selectitems, é realmente necessário sobrescrever o método toString da classe que vai ser exibida no combo.

Michel_Sancovich

com o rich combobox, parece que tem que fazer um converter, confere?

alias

cara, tambem tava pensando nisso, em criar um convert para tratar o objeto…

vou fazer e testar…vou dar a ultima chance pra essa joça funcionar! :smiley:

Michel_Sancovich

blza… pq ele tah retornando:

[br.com.empresa.projeto.entity.Item@7beda, br.com.empresa.projeto.entity.Item@1d5aac]
alias

e voce está usando o Converter?

Michel_Sancovich

intao, estou pesquisando sobre isto…

:slight_smile:

M

alias:
Usando um array de SelectItem[]?vixi…rs.valeu pela dica,vou testar sim…brigadao!Mas onde coloco esse array, jogo ele em qual propriedade do componente?

Na mesma propriedade que vc coloca o ArrayList, eu lembro que muitas vezes eu nao conseguia usar o ArrayList, entao sempre optei pelo array primitivo do proprio componente, entao tenta-e.

Michel_Sancovich

Kra, deu certo!!! Daki a poko posto o codigo!!!

Michel_Sancovich

Na classe Item fica assim:

@Override
	public String toString() {
		  String result = nome;
		  return result;
	}

E no xhtml:

<rich:comboBox selectFirstOnUpdate="false" defaultLabel="Escolha um item">
		<s:selectItems value="#{itemList.resultList}" var="item" />
	</rich:comboBox>
alias

cara, voce fez isso usando o Converter?se sim, pode postar a classe Converter?

e outra…quando voce retorna o value do combo, o que é que vem?a string do item que foi selecionada?

Michel_Sancovich

Vamos por partes:

  1. Não utilizei converter não. Eu gerei o método toString no Bean que eu queria ( neste caso o Item, que foi gerado pelo JBoss Seam):
@Entity
@Table(name = "item", schema = "public")
public class Item implements java.io.Serializable {


	private static final long serialVersionUID = -1014823309049742932L;
	private int idItem;
	private String nome;

	@Id
	@Column(name = "id_item", unique = true, nullable = false)
	@NotNull
	public int getIdItem() {
		return this.idItem;
	}

	public void setIdItem(int idItem) {
		this.idItem = idItem;
	}

	@Column(name = "nome", length = 45)
	@Length(max = 45)
	public String getNome() {
		return this.nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

Depois, nesta mesma classe, eu gerei o toString( generate… ) e ficou assim:

@Override
	public String toString() {
	
	}

Como eu quero pegar o nome do item, eu criei uma String para dar o retorno que o método necessita:

@Override
	public String toString() {
		  String result = nome;
		  return result;
	}

Dpois disto é só mexer no xhtml:

<rich:comboBox selectFirstOnUpdate="false" defaultLabel="Escolha um item">  
    <s:selectItems value="#{itemList.resultList}" var="item" />  
</rich:comboBox>

Pronto!!! Agradeço a ajuda e qq coisa posta ae!

:lol:

alias

mas entao, velho, o galho é que eu quero que SEJA EXIBIDO o nome, e que eu consiga capturar o IdItem (usando o exemplo aí da sua classe)…tá fazendo isso? :frowning:

Michel_Sancovich

Sim está exibindo o nome.

alias

e se voce precisar do id desse cara, como voce vai fazer? :wink:

Michel_Sancovich

Vamos seguir a metodologia XP, vamos por partes… hehehe

alias

hehehe… :lol:…pois é, é que esse é o problema do rich:combo…se voce retornar o value do cara vem a string que está selecionada na combo, e nao o valor oculto do item…ao que me parece esse componente foi feito pra se trabalhar com lista de string, e isso muitas vezes nao serve pra nada… :cry:

Criado 3 de outubro de 2008
Ultima resposta 7 de out. de 2008
Respostas 27
Participantes 3