Ajuda com JComboBox

10 respostas
jeanmalvessi

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:
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());
        }
    }
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!

10 Respostas

F

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?

jeanmalvessi

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?

Como faço pra pegar somente o nome do estado selecionado e passar por parâmetro ?

F

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?

jeanmalvessi

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?

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

Bruno.Souza.PW

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();
F

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

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.

jeanmalvessi

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

Estou usando hibernate. Mas enfim, isso resolveu meu problema… Obrigado! :lol:

jeanmalvessi

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.

Obrigado, vou fazer isso sim!

GusMcCart

OK… qualquer duvida na implementação avisa aí.

Criado 4 de julho de 2012
Ultima resposta 5 de jul. de 2012
Respostas 10
Participantes 4