package control;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;
import model.Pais;
import model.UnidadeFederacao;
import dao.PaisDao;
import dao.PaisDaoImp;
import dao.UnidadeFederacaoDao;
import dao.UnidadeFederacaoDaoImp;
@ManagedBean
@ViewScoped
public class PaisController implements Serializable {
private Pais pais;
private DataModel listaPaises;
private List<Pais> filteredPaises;
private Boolean isInsercao;
private Boolean isAlteracao;
private List<SelectItem> ufs = new ArrayList<SelectItem>();
private List<SelectItem> listaPaisesCombo;
public List<Pais> getFilteredPaises() {
return filteredPaises;
}
public void setFilteredPaises(List<Pais> filteredPaises) {
this.filteredPaises = filteredPaises;
}
public DataModel getListarPaises() {
List<Pais> lista = new PaisDaoImp().list();
listaPaises = new ListDataModel(lista);
return listaPaises;
}
public void setListaPaisesCombo(List<SelectItem> listaPaisesCombo) {
this.listaPaisesCombo = listaPaisesCombo;
}
public List<SelectItem> getListaPaisesCombo() {
List<SelectItem> listaCombo = new ArrayList<SelectItem>();
List<Pais> lista = new PaisDaoImp().list();
PaisDao pd = new PaisDaoImp();
for (int i = 1; i <= lista.size(); i++) {
SelectItem item = new SelectItem();
item.setLabel(lista.get(i - 1).getNome());
//item.setValue(pd.findById(lista.get(i - 1).getCodigo()));
item.setValue(lista.get(i - 1));
listaCombo.add(item);
}
listaPaisesCombo = listaCombo;
return listaPaisesCombo;
}
public List<SelectItem> getUFsByPais() {
List<SelectItem> listaCombo = new ArrayList<SelectItem>();
List<UnidadeFederacao> lista = new PaisDaoImp().getUFsByPais(this.pais.getCodigo());
UnidadeFederacaoDao uf = new UnidadeFederacaoDaoImp();
for (int i = 1; i <= lista.size(); i++) {
SelectItem item = new SelectItem();
item.setLabel(lista.get(i - 1).getNome());
item.setValue(uf.findById(lista.get(i - 1).getCodigo()));
listaCombo.add(item);
}
return listaCombo;
}
public void actionCarregaUFs() {
System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
//this.ufs = this.getUFsByPais();
}
public Pais getPais() {
return pais;
}
public void setPais(Pais pais) {
this.pais = pais;
}
public String prepararAdicionarPais() {
pais = new Pais();
isInsercao = true;
isAlteracao = false;
return "gerenciarPais";
}
public String prepararAlterarPais() {
pais = (Pais) (listaPaises.getRowData());
isInsercao = false;
isAlteracao = true;
return "gerenciarPais";
}
public String excluirPais() {
Pais paisTemp = (Pais) (listaPaises.getRowData());
PaisDao dao = new PaisDaoImp();
dao.remove(paisTemp);
return "index";
}
public String adicionarPais() {
PaisDao dao = new PaisDaoImp();
dao.save(pais);
return "index";
}
public String alterarPais() {
PaisDao dao = new PaisDaoImp();
dao.update(pais);
return "index";
}
public Boolean getIsInsercao() {
return isInsercao;
}
public void setIsInsercao(Boolean insercao) {
this.isInsercao = insercao;
}
public Boolean getIsAlteracao() {
return isAlteracao;
}
public void setIsAlteracao(Boolean alteracao) {
this.isAlteracao = alteracao;
}
public List<SelectItem> getUfs() {
return ufs;
}
public void setUfs(List<SelectItem> ufs) {
this.ufs = ufs;
}
}
Meu problema é bem estranho: por padrão no combobox vem o item “Selecione…”, e logo após vem “Brasil, “Argentina”, “Uruguai”, etc…
O método ‘paisController.actionCarregaUFs’ deveria ser executado cada vez que eu mudasse o item do combo, só que acontece o seguinte: ao carregar a página, vem listados os países no combo e por default vem o item ‘Selecione…’. Se eu clicar no combo e mudar para ‘Brasil’, o método não executa, porém se eu voltar para o item 'Selecione…” o método é executado. Ele deveria ser executado quando eu mudei para ‘Brasil’! O método só executa quando eu volto para ‘Selecione…’, mudando para qualquer outro item do combo o método não executa!
O que tem de errado? O que eu devo fazer? Por favor, ficarei muito grato se alguém puder me ajudar.
Ok, desculpe a informação errada. Colocando o ‘event=“change”’ ou não colocando, dá na mesma (no meu caso). Encontrei aqui no fórum uma pessoa que estava com a mesma situação que a minha, mas pra ele o problema foi resolvido colocando o o escopo do bean como @ViewScoped. O meu bean já está com @ViewScoped e mesmo assim não funciona. O evento só é acionado quando é selecionado o item ‘Selecione…’.
Preciso muito resolver esse problema.
Mas o que eu colocaria no “itemLabel” e 'itemValue" já que estou usando uma lista de SelecItem? O SelecItem já tem “dentro” dele o “itemLabel” e “itemValue”.
P.S.: tentei colocar o “itemLabel” e “itemValue” com vazio e não funcionou.
O SelectItem já possui o itemLabel e itemValue.
Repare o código que estou usando:
public List<SelectItem> getListarPaisesCombo() {
List<SelectItem> listaCombo = new ArrayList<SelectItem>();
List<Pais> lista = new PaisDaoImp().list();
PaisDao pd = new PaisDaoImp();
for (int i = 1; i <= lista.size(); i++) {
SelectItem item = new SelectItem();
item.setLabel(lista.get(i - 1).getNome());
item.setValue(lista.get(i - 1));
listaCombo.add(item);
}
return listaCombo;
}
Você esta setando o objeto Pais direto no sectItem, mas não especificou nenhum Converter. Acredito que tenha que criar um Converter para suas classes.
Não está aparecendo nenhum erro no console?
Não utilizo Converter. O código abaixo supostamente substituiria o conversor, pois estou passando um SelectItem:
public List<SelectItem> getListarPaisesCombo() {
List<SelectItem> listaCombo = new ArrayList<SelectItem>();
List<Pais> lista = new PaisDaoImp().list();
PaisDao pd = new PaisDaoImp();
for (int i = 1; i <= lista.size(); i++) {
SelectItem item = new SelectItem();
item.setLabel(lista.get(i - 1).getNome());
item.setValue(lista.get(i - 1));
listaCombo.add(item);
}
return listaCombo;
}
E não aparece nenhuma mensagem de erro. O SelectOneMenu espera um objeto do tipo Pais, e é isso que os itens estão devolvendo.
Meu, olha só, tentei simular o problema aqui e o que descobri é que não funciona se vc setar o objeto Pais no controlador, vc precisa setar uma String e através dela encontrar o Pais correspondente.
Provavelmente é o que o outro colega falou, ta faltando um converter.