Ajuda com JComboBox

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 &lt; estados.size(); i++) {
        Estado est = estados.get(i);
        cEstados.addItem(est.getNome());
    }
}

private void loadCidades() {
    List&lt;Cidade&gt; cidades = new ArrayList&lt;&gt;();
    CidadeJpaController cidJpa = new CidadeJpaController();
    cidades.addAll(cidJpa.findCidadeEntities());

    for (int i = 0; i &lt; 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&lt;Cidade&gt; listCid; try { listCid = cidadeJpa.findCidadeByEstado(((Estado) cEstados.getSelectedItem())); cCidades.removeAllItems(); Iterator&lt;Cidade&gt; 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 ? :frowning:

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 :stuck_out_tongue:

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í.