[RESOLVIDO] Enviar dados de uma Datatable para outra Datatable com PrimeFaces e JSF

Bom dia, gostaria da ajuda de vocês pelo seguinte caso.

Preciso fazer o seguinte: Tenho duas datatable na pagina e alguns dados vindo do banco no primeiro datatable. Quero ao selecionar algum ou vários itens dessa tabela, clicar em um botão “adicionar” ele adicionar os dados selecionado para a tabela 2. Como se fosse um “picklist”, porém não fiz com picklist pois eu não sei como fazer uma consulta rápida igual a table, e também procurei bastante e não vi nenhum exemplo que faça (Talvez é o que faltava para a picklist ficar completa, ter um “filter by” na lista).

Então segue o meu código que tentei fazer, só que ao tentar adicionar na tabela 2 os dados não carrega na tal tabela (tabela 2) e também não aparece mensagem de erro.

Código xhtml


<h:panelGrid cellpadding="3" style="width:100%">
								<p:dataTable id="dataAcesso1" style="height:100px"
									value="#{perfilAcessoBean.source}" var="perfilAcesso"
									paginator="true" rows="10" selectionMode="multiple"
									selection="#{perfilAcessoBean.selectAcesso}"
									rowKey="#{perfilAcesso.descricao}">

									<p:column headerText="Perfil"
										filterBy="#{perfilAcesso.descricao}">
										<h:outputText value="#{perfilAcesso.descricao}" />
									</p:column>
								</p:dataTable>

								<p:spacer height="40" />

								<p:commandButton image="ui-icon ui-icon-disk" value="Adicionar"
									action="#{perfilAcessoBean.adicionarAcesso}"
									update="dataaAcesso2" />

								<p:spacer height="5" />

								<p:dataTable id="dataAcesso2" style="height:100px"
									value="#{perfilAcessoBean.target}" var="perfilAcesso"
									paginator="true" rows="10" selectionMode="single" rowKey="">

									<p:column headerText="Perfil"
										filterBy="#{perfilAcesso.descricao}">
										<h:outputText value="#{perfilAcesso.descricao}" />
									</p:column>
								</p:dataTable>


							</h:panelGrid>

Código Bean JSF

@ManagedBean(name = "perfilAcessoBean")
@RequestScoped
public class PerfilAcessoBean {

	private PerfilAcesso perfilAcesso = new PerfilAcesso();
	private List<Perfil> listPerfil;
	private List<Acesso> source;
	private List<Acesso> target;
	private Acesso acesso;
	private Perfil perfil;
	private Perfil selectPerfil;
	private Acesso[] selectAcesso;
	private String pesquisar;

	public List<Acesso> getSource() {
		AcessoRN acessoRN = new AcessoRN();
		this.source = acessoRN.listAll();
		return source;
	}

	public void setSource(List<Acesso> source) {
		this.source = source;
	}

	public List<Acesso> getTarget() {
		return target;
	}

	public Acesso[] getSelectAcesso() {
		return selectAcesso;
	}

	public void setSelectAcesso(Acesso[] selectAcesso) {
		this.selectAcesso = selectAcesso;
	}

	public void setTarget(List<Acesso> target) {
		this.target = target;
	}

	public String getPesquisar() {
		return pesquisar;
	}

	public void setPesquisar(String pesquisar) {
		this.pesquisar = pesquisar;
	}

	public Perfil getSelectPerfil() {
		return selectPerfil;

	}

	public void setSelectPerfil(Perfil selectPerfil) {
		this.selectPerfil = selectPerfil;
	}

	public Perfil getPerfil() {
		return perfil;
	}

	public void setPerfil(Perfil perfil) {
		this.perfil = perfil;
	}

	public Acesso getAcesso() {
		return acesso;
	}

	public void setAcesso(Acesso acesso) {
		this.acesso = acesso;
	}

	public PerfilAcesso getPerfilAcesso() {
		return perfilAcesso;
	}

	public void setPerfilAcesso(PerfilAcesso perfilAcesso) {
		this.perfilAcesso = perfilAcesso;
	}

	public List<Perfil> getListPerfil() {
		return this.listPerfil;
	}

	public String onFlowProcess(FlowEvent event) {
		return event.getNewStep();
	}

	public String save() {

		return "sucessoPerfilAcesso";
	}

	public void adicionarAcesso() {
		for (int i = 0; i < getSelectAcesso().length; i++) {
			System.out.println(this.source.get(i).getDescricao());
			this.target.add(this.source.get(i));
		}
	}

	public void pesquisarPerfil() {
		PerfilRN perfilRN = new PerfilRN();
		this.listPerfil = perfilRN.listAll();
	}

}

Atenciosamente
Wellington Fernandes

voce pode fazer 1 metodo que cada vez q vc seleciona uma linha com 1 checkbox ele add em 1 lista…e a 2 datable carrega essa lista

Bem… pega o registro selecionado e adiciona na outra lista… então você da update na datatable.

Sim, é o que estou fazendo, mas não esta dando certo. Dê uma olhada para você ver no meu código.

Existem várias possibilidades. Caso você queira usar o picklist, veja este exemplo. Caso queira usar dataTable você deve criar mais uma coluna na primeira tabela com um p:commandButton e utilizar o f:setPropertyActionListener para indicar que o objeto #{perfilAcesso}, que é percorrido na tabela, será setado no objeto #{perfilAcessoBean.selectPerfil}. No método adicionarAcesso você simplesmente adicionará o objeto selectPerfil à lista target e remover da source. Ah! lembre-se de sobrescrever os metodos equals e hashcode.

Veja como ficaria:

<p:dataTable id="dataAcesso1" style="height:100px"  
                                    value="#{perfilAcessoBean.source}" var="perfilAcesso"  
                                    paginator="true" rows="10" selectionMode="multiple"  
                                    selection="#{perfilAcessoBean.selectAcesso}"  
                                    rowKey="#{perfilAcesso.descricao}">  
  
                                    <p:column headerText="Perfil"  
                                        filterBy="#{perfilAcesso.descricao}">  
                                        <h:outputText value="#{perfilAcesso.descricao}" />  
                                    </p:column>  
<p:column>
<p:commandButton image="ui-icon ui-icon-disk" value="Adicionar"  
                                    action="#{perfilAcessoBean.adicionarAcesso}"  
                                    update="dataaAcesso2" >
<f:setPropertyActionListener value="#{perfilAcesso}"
                                                         target="#{perfilAcessoBean.selectPerfil}"/>
</p:commandButton>  
</p:column>
                                </p:dataTable>  
  
                                <p:dataTable id="dataAcesso2" style="height:100px"  
                                    value="#{perfilAcessoBean.target}" var="perfilAcesso"  
                                    paginator="true" rows="10" selectionMode="single" rowKey="">  
  
                                    <p:column headerText="Perfil"  
                                        filterBy="#{perfilAcesso.descricao}">  
                                        <h:outputText value="#{perfilAcesso.descricao}" />  
                                    </p:column>  
                                </p:dataTable> 
public void adicionarAcesso() {  
      target.add(selectPerfil);
      source.remove(selectPerfil);
    }

Uma outra forma legal seria você utilizar a opção selectionMode=“multiple” e selecionar varias opções e depois inseri-las na outra lista, é um pouco mais complexo, porém mais elegante. Veja no showcase.

Espero ter ajudado, abraços.

Obrigado pelas dicas Benignoms porém quando clico no botão pare adicionar dá erro e não aparece nada na segunda tabela, pelo que percebi nem esta executando o método para adicionar.

att
Wellington

Wellington,

O escopo tem de ser, no mínimo, @ViewScoped. Qual você esta usando?

Estou usando ViewScope, porém já consegui resolver, mas o que esta acontecendo agora, é que quando eu adiciono na tabela 2, a linha selecionada da tabela 1 não remove, sendo assim tem como adicionar itens repetido… Alguma idéia?

Altere isso no botão

Disso: update=“dataaAcesso2”
Para isso: update=“dataaAcesso2 dataAcesso1”

Já havia feito isso, porém não funciona.