Rich faces + carregando picklist com itens selecionados

Galera,

Alguém tem noção de como faço pra carregar um rich:picklist com informações ´já selecionadas ???

Tentei criar um List<SelectItem> preenchido e colocar no value, mas dá o seguinte erro:

SEVERE: Error Rendering View[/telas/principal.xhtml]
java.lang.IllegalArgumentException: Value is not String (class=javax.faces.model.SelectItem, value=javax.faces.model.SelectItem@15ef3e7) and component content:corpo:page:data:upd_filiais does not have a Converter
	at org.richfaces.utils.PickListUtils.getConvertedStringValue(PickListUtils.java:173)

Alguém já fez isso ? Valeu

Opa,
Você deve usar um list de Integer.
Tente assim:

           private List<Integer>      itensSelecionados;
           //get + set

[]´s

Daniel

Mas e a descrição ??? Como faço pra colocar ?

Você utiliza outra lista.

Preencha a lista “itens” com todas as opções e preencha a lista “itensSelecionados” com os códigos das opções que quer selecionadas.
Algo +/- assim:
no Bean:


private List<SelectItem>   itens;
private List<Integer>        itensSelecionados;

no JSP:

    <rich:pickList value="#{seuBean.itensSelecionados}" > 
       <f:selectItems value="#{seuBean.itens}"/>
    </rich:pickList>

Cara, funcionou ! Obrigado, precisando estamos ai !!!

E caso eu queira o inverso, ou seja, no Bean recuperar os itens que foram selecionados?

Abraços!

utilize rich:listShuttle

[code]<rich:listShuttle var=“item”
sourceValue="#{bean.listaEsquerda}"
targetValue="#{bean.listaDireita}">

			  <rich:column>
			  	<h:outputText value="#{item.algumaCoisa}" id="desc_sisseg"/>
			  </rich:column>
		  				
	</rich:listShuttle>[/code]

onde as listas são um ArrayList.
Para trazer os registros que já foram selecionados e os que não foram, separe na sua consulta.

Olá amigos!

Estou precisando da ajuda de vcs com um projeto onde preciso selecionar em uma lista o artista e mostrar em outra os albuns associados a este artista.

Nesta tela que citei, estou tentando utilizar o componente orderingList. Coloquei 2 orderingList, um para os artistas e outro para os álbuns.

O PROBLEMA: Quando eu clico no artista, a chamada ao metodo ocorre na primeira vez sem problemas. A segunda vez, passa pela classe Converter e ai o metodo nao é chamado. Percebi o seguinte: quando a primeira vez, encontra o album ou albuns para o artista, o metodo popula na boa a lista de albuns mas dai é que começa a ocorrer o que citei. Dá a impressão que o converter pega sempre o valor que está na lista de álbuns e “não deixa” o método filtrarAlbuns ser chamado.

Já tentei mudar para o componente mais simples do JSF (selectmanylistbox) mas não vingou. Vou postar os codigos aqui para vcs me darem uma força

paginaPrincipal.xhtml
Esta dentro de um a4:form e paineis (so postei as colunas com os 2 orderingLists)

				<h:column id="coluna1">
					<rich:orderingList id="listaArtistas" value="#{principalBean.artistas}"
						selection="#{principalBean.artistasSelecionados}" 
						var="artista" listHeight="370" listWidth="165" 
						converter="artistaConverter" fastOrderControlsVisible="false" orderControlsVisible="false" >
				    	<rich:column width="180">
				            <f:facet name="header">
				                <h:outputText id="tituloArtistas" value="Artistas" style="font-weight:bold;"/>
				            </f:facet> 
			                <h:outputText id="nomeArtista" value="#{artista.nomeArtista}"></h:outputText>
			            </rich:column>
			            
			            <a4j:support id="sup1" event="onclick" 
			            	action="#{principalBean.filtrarAlbuns}" reRender="listaAlbuns" />
          				<a4j:support id="sup345" event="onkeyup"
          					action="#{principalBean.filtrarAlbuns}" reRender="listaAlbuns" />	
          								            				            
			        </rich:orderingList>				
				</h:column>
				<h:column id="coluna2">
					<rich:orderingList id="listaAlbuns" value="#{principalBean.albuns}" 
						selection="#{principalBean.albunsSelecionados}" 
						var="album" listHeight="370" listWidth="165" 
						converter="albumConverter" fastOrderControlsVisible="false" orderControlsVisible="false" >
			            <rich:column width="180">
				            <f:facet name="header">
				                <h:outputText id="tituloAlbuns" value="Álbuns" style="font-weight:bold;"/>
				            </f:facet> 
							<h:inputHidden id="idAlbum" value="#{album.idAlbum}"></h:inputHidden>				            				            
			                <h:outputText id="nomeArtista" value="#{album.nomeAlbum}"></h:outputText>
			            </rich:column>
			        </rich:orderingList>
				</h:column>

PrincipalBean.java

package managedbean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import model.Album;
import model.Artista;
import model.Musica;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

import retorno.RetornoAlbum;
import retorno.RetornoArtista;
import controller.GerenteAlbum;
import controller.GerenteArtista;



public class PrincipalBean implements Serializable {

	private static final long serialVersionUID = 8914596525261452207L;
	
	
	private Album album = new Album();
	private Artista artista = new Artista();
	private Musica musica = new Musica();
	private List<Album> albuns = new ArrayList<Album>();
	private List<Artista> artistas = new ArrayList<Artista>();
	private List<Musica> musicas = new ArrayList<Musica>();
	
	private Set<Artista> artistasSelecionados;
	private Set<Album> albunsSelecionados;
	private Set<Album> albunsColecaoSelecionados;
	
	public PrincipalBean() {
	}
		
	// Carrega lista de albuns de acordo com artista selecionado
	public void filtrarAlbuns() {

		if(artistasSelecionados.size() > 0){
			for (Iterator<Artista> it = artistasSelecionados.iterator(); it.hasNext();) {
				Artista artista = it.next();
				
				RetornoAlbum tResult;
				tResult = GerenteAlbum.selectListaAlbunsByNomeArtista(artista.getNomeArtista());
				if(tResult.isOk())
					this.albuns = tResult.getListaAlbuns();
				else{
					
					this.albuns = new ArrayList<Album>();
					// Cria uma nova mensagem de informação para o JSF
					FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, tResult.getMensagem(), tResult.getMensagem());
					// Adiciona a mensagem ao formulário (que consta declarado no template)
					FacesContext.getCurrentInstance().addMessage(null, message);						
					
				}
					
			}

		}else {
			
			String mensagemAviso = "Selecione apenas um artista para visualizar a lista de álbuns";
			// Cria uma nova mensagem de informação para o JSF
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, mensagemAviso, mensagemAviso);
			// Adiciona a mensagem ao formulário (que consta declarado no template)
			FacesContext.getCurrentInstance().addMessage(null, message);			
			
		}
	}		
	    
    /** Getters and Setters **/
	
	public Album getAlbum() {
		return album;
	}

	public void setAlbum(Album album) {
		this.album = album;
	}
	
	public Artista getArtista() {
		return artista;
	}

	public void setArtista(Artista artista) {
		this.artista = artista;
	}	

	public Musica getMusica() {
		return musica;
	}

	public void setMusica(Musica musica) {
		this.musica = musica;
	}

	public List<Album> getAlbuns() {
		return albuns;
	}

	public void setAlbuns(List<Album> albuns) {
		this.albuns = albuns;
	}
	
	public List<Artista> getArtistas() {
		RetornoArtista tResult;
		tResult = GerenteArtista.selectAll();
		return tResult.getListaArtistas();	
	}
	
	public void setArtistas(List<Artista> artistas) {
		this.artistas = artistas;
	}

	public List<Musica> getMusicas() {
		return musicas;
	}

	public void setMusicas(List<Musica> musicas) {
		this.musicas = musicas;
	}
	
	public Set<Artista> getArtistasSelecionados() {
		return artistasSelecionados;
	}

	public void setArtistasSelecionados(Set<Artista> artistasSelecionados) {
		this.artistasSelecionados = artistasSelecionados;
	}

	public Set<Album> getAlbunsSelecionados() {
		return albunsSelecionados;
	}

	public void setAlbunsSelecionados(Set<Album> albunsSelecionados) {
		this.albunsSelecionados = albunsSelecionados;
	}

	public Set<Album> getAlbunsColecaoSelecionados() {
		return albunsColecaoSelecionados;
	}

	public void setAlbunsColecaoSelecionados(Set<Album> albunsColecaoSelecionados) {
		this.albunsColecaoSelecionados = albunsColecaoSelecionados;
	}	
	
}

AlbumConverter

package converter;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;

import model.Album;

public class AlbumConverter implements Converter {

    public AlbumConverter() {
    }

    public Object getAsObject(FacesContext facesContext, UIComponent component, String infoAlbum) {

    	//Convertendo String para Object Album
    	String[] words = infoAlbum.split(":");
    	String idAlbum = words[0];
    	String nomeAlbum = words[1];
      	return new Album(Integer.valueOf(idAlbum), nomeAlbum);

    }

    public String getAsString(FacesContext facesContext, UIComponent uIComponent, Object object) {
       
    	//Convertendo Object Album para String
    	return object.toString();
    }
    
} 

Album.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Album implements Serializable{

	private static final long serialVersionUID = -3569156520961540220L;

	private Integer idAlbum;
    private String nomeAlbum;
    private Integer anoLancamento;
    private byte[] fotoImagem;
    private List<Artista> listaArtistas = new ArrayList<Artista>();

    public Album() {
    }

    // Mostrar album na lista
    public Album(Integer idAlbum, String nomeAlbum) {
        this.idAlbum = idAlbum;
        this.nomeAlbum = nomeAlbum;
    }
    
    // Update
    public Album(Integer idAlbum, String nomeAlbum, Integer anoLancamento, byte[] fotoImagem) {
        this.idAlbum = idAlbum;
        this.nomeAlbum = nomeAlbum;
        this.anoLancamento = anoLancamento;
        this.fotoImagem = fotoImagem;
    }

    // Insert
    public Album(String nomeAlbum, Integer anoLancamento, byte[] fotoImagem) {
        this.nomeAlbum = nomeAlbum;
        this.anoLancamento = anoLancamento;
        this.fotoImagem = fotoImagem;
    }

    // Delete
    public Album(Integer idAlbum) {
        this.idAlbum = idAlbum;
    }

    // Select By Name
    public Album(String nomeAlbum) {
        this.nomeAlbum = nomeAlbum;
    }

    /**
     * @return the idAlbum
     */
    public Integer getIdAlbum() {
        return idAlbum;
    }

    /**
     * @param idAlbum the idAlbum to set
     */
    public void setIdAlbum(Integer idAlbum) {
        if (idAlbum <= 0) {
            throw new IllegalArgumentException("Número zerado ou negativo");
        }
        this.idAlbum = idAlbum;
    }

    /**
     * @return the nomeAlbum
     */
    public String getNomeAlbum() {
        return nomeAlbum;
    }

    /**
     * @param nomeAlbum the nomeAlbum to set
     */
    public void setNomeAlbum(String nomeAlbum) {
        if (nomeAlbum == null || nomeAlbum.equalsIgnoreCase("")) {
            throw new IllegalArgumentException("Nome do album com valor nulo ou vazio");
        }
        this.nomeAlbum = nomeAlbum;
    }

    /**
     * @return the anoLancamento
     */
    public Integer getAnoLancamento() {
        return anoLancamento;
    }

    /**
     * @param anoLancamento the anoLancamento to set
     */
    public void setAnoLancamento(Integer anoLancamento) {
        this.anoLancamento = anoLancamento;
    }

    /**
     * @return the listaArtistas
     */
    public List<Artista> getListaArtistas() {
        return listaArtistas;
    }

    /**
     * @param listaArtistas the listaArtistas to set
     */
    public void setListaArtistas(List<Artista> listaArtistas) {
        this.listaArtistas = listaArtistas;
    }

    /**
     * @return the fotoImagem
     */
    public byte[] getFotoImagem() {
        return fotoImagem;
    }

    /**
     * @param fotoImagem the fotoImagem to set
     */
    public void setFotoImagem(byte[] fotoImagem) {
        this.fotoImagem = fotoImagem;
    }

     // Para mostrar na lista de musicas e tambem na comboBox (CadMusica)
     public String toString() {
         return idAlbum + ":" + nomeAlbum;
     }

    @Override
    public boolean equals(Object obj) {

        if (obj == null)
            return false;

        if (!(obj instanceof Album))
            return false;

        if (getIdAlbum() == null)
            return false;

        final Album other = (Album) obj;
        
        return getIdAlbum().equals(other.getIdAlbum());

    }

    @Override
    public int hashCode() {
        return this.idAlbum;
    }
    
}

Pessoal, consegui resolver, finalmente !! Hehe…

Coisa simples que eu deveria ter visto antes.

Segue a dica para quem passar por este mesmo problema.

É necessário inserir a tag ajaxSingle=“true”. Isso porque , como pesquisei:

  • ajaxSingle :processa somente o componente em questão e no caso de a4j:support o componente pai

    Sendo assim, quando coloquei a tag citada, ele só processou o componente orderingList de Artistas. Nada de ter que ir la no converter do Album. Somente processa com o converter do Artista pois foi clicado em um item Artista da lista.

<a4j:support id="sup1" event="onclick" ajaxSingle="true"
         	action="#{principalBean.filtrarAlbuns}" reRender="listaAlbuns" />

Sds,
Rodrigo Bortolon