Boa tarde a todos!
Estou com a seguinte situação:
Tenho 3 JComboBox: País, Estado, Cidade.
No combo país tenho só Brasil.
Mas no como Estado, onde tenho todos os estados do Brasil, quero fazer com que, ao clicar em algum, fazer a busca das cidades daquele estado para listar no combo Cidade.
Fiz o seguinte até agora:
Ao iniciar o JFrame:
[code]private void loadEstados() {
List<Estado> estados = new ArrayList<>();
EstadoJpaController estadoJpa = new EstadoJpaController();
estados.addAll(estadoJpa.findEstadoEntities());
for (int i = 0; i < estados.size(); i++) {
Estado est = estados.get(i);
cEstados.addItem(est.getNome());
}
}
private void loadCidades() {
List<Cidade> cidades = new ArrayList<>();
CidadeJpaController cidJpa = new CidadeJpaController();
cidades.addAll(cidJpa.findCidadeEntities());
for (int i = 0; i < cidades.size(); i++) {
Cidade cid = cidades.get(i);
cCidades.addItem(cid.getNome());
}
}[/code]
Ao selecionar algum estado:
private void cEstadosItemStateChanged(java.awt.event.ItemEvent evt) {
CidadeJpaController cidadeJpa = new CidadeJpaController();
List<Cidade> listCid;
try {
listCid = cidadeJpa.findCidadeByEstado(((Estado) cEstados.getSelectedItem()));
cCidades.removeAllItems();
Iterator<Cidade> i = listCid.iterator();
while (i.hasNext()) {
cCidades.addItem(i.next());
}
} catch (Exception e) {
System.out.println(e);
}
}
Mas quando chega na seguinte linha:
listCid = cidadeJpa.findCidadeByEstado(((Estado) cEstados.getSelectedItem()));
Tenho o seguinte erro:
java.lang.ClassCastException: java.lang.String cannot be cast to modelo.Estado
O método getSelectedItem() retorna um Object e eu estou o convertendo para Estado… Por que está dando esse erro ? 
Valeu!
Vc adiciona no comboBox o nome do estado, (String).
Como que ao pegar essa String vc quer transformá-la em um Estado?
Ou vc instancia um novo estado, ou cria um modelo para o ComboBox não utilizar o model default.
Mas nesse método cidadeJpa.findCidadeByEstado(), vc precisa passar o objeto mesmo, não é suficiente apenas o nome do Estado?
[quote=felipeaps]Vc adiciona no comboBox o nome do estado, (String).
Como que ao pegar essa String vc quer transformá-la em um Estado?
Ou vc instancia um novo estado, ou cria um modelo para o ComboBox não utilizar o model default.
Mas nesse método cidadeJpa.findCidadeByEstado(), vc precisa passar o objeto mesmo, não é suficiente apenas o nome do Estado?[/quote]
Como faço pra pegar somente o nome do estado selecionado e passar por parâmetro ?
Calma, antes vc tem que verificar se o método findCidadeByEstado() necessita mesmo do objeto Estado,
ou se é possível apenas usar o nome do estado. O que é feito nesse método, select no banco?
[quote=felipeaps]Calma, antes vc tem que verificar se o método findCidadeByEstado() necessita mesmo do objeto Estado,
ou se é possível apenas usar o nome do estado. O que é feito nesse método, select no banco?[/quote]
Segue:
public List<Cidade> findCidadeByEstado(Estado est) {
EntityManager em = getEntityManager();
try {
Query q = em.createQuery("select object(o) from Cidade as o where o.estado = :est");
q.setParameter("est", est);
return q.getResultList();
} finally {
em.close();
}
}
Eu poderia criar outro método, recebendo um String nome e mudar o “where o.estado” por “where o.estado.nome”, só não sei como pegar o nome do combo 
Desculpe a ignorância, até hoje só desenvolvi para web
se não foi declarado na criação e instanciação ele retorna sempre ‘Object’
JComboBox<Estado> jcbEstado = new JComboBox<Estado>();
so não entendi o que esse metodo faz?
cidadeJpa.findCidadeByEstado();
Para falar a verdade, não entendi sua estrutura no banco hahahaha.
Para pegar o nome é só fazer oq vc estava fazendo. Tira o cast, ai fica: listCid = cidadeJpa.findCidadeByEstado(cEstados.getSelectedItem().toString());
Ou seja, está passando uma String (o nome do estado).
Uma dica: Como você tem a entidade “estado”, implementa um modelo pro comboBox (extends AbstractListModel implements ComboBoxModel)
e sobrescreve o método toString() na classe Estado pra retornar só a sigla da UF, ou o que você quiser… tipo assim
@Override
public String toString()
{
return this.sigla;
}
No caso, implementando um modelo pro ComboBox, você não precisa ficar fazendo loop e tal pra populá-lo, basta setar o modelo na inicialização e, implementado corretamente, ele já joga as informações na tela pra você.
Nota: o que aparece sempre em qualquer comboBox, JTable e afins é o método toString() do objeto em questão… Fazendo dessa forma você pode internamente retornar um objeto, mas na hora de “jogar isso na tela” o que aparece é o retorno do toString() do objeto. Sem falar que a meu ver é uma melhor forma de implementação.
[quote=felipeaps]Para falar a verdade, não entendi sua estrutura no banco hahahaha.
Para pegar o nome é só fazer oq vc estava fazendo. Tira o cast, ai fica: listCid = cidadeJpa.findCidadeByEstado(cEstados.getSelectedItem().toString());
Ou seja, está passando uma String (o nome do estado).[/quote]
Estou usando hibernate. Mas enfim, isso resolveu meu problema… Obrigado! :lol:
[quote=GusMcCart]Uma dica: Como você tem a entidade “estado”, implementa um modelo pro comboBox (extends AbstractListModel implements ComboBoxModel)
e sobrescreve o método toString() na classe Estado pra retornar só a sigla da UF, ou o que você quiser… tipo assim
@Override
public String toString()
{
return this.sigla;
}
No caso, implementando um modelo pro ComboBox, você não precisa ficar fazendo loop e tal pra populá-lo, basta setar o modelo na inicialização e, implementado corretamente, ele já joga as informações na tela pra você.
Nota: o que aparece sempre em qualquer comboBox, JTable e afins é o método toString() do objeto em questão… Fazendo dessa forma você pode internamente retornar um objeto, mas na hora de “jogar isso na tela” o que aparece é o retorno do toString() do objeto. Sem falar que a meu ver é uma melhor forma de implementação.[/quote]
Obrigado, vou fazer isso sim!
OK… qualquer duvida na implementação avisa aí.