Ajuda com Java Swing

11 respostas
java
F

Olá Pessoal,
Tenho uma tela onde tenho um botão pesquisar.
Quando clico no botão, abre outra tela. OK
Dentro dela tenho a minha pesquisa até achar a informação que eu preciso(o ID). OK
Estou com problema para ‘voltar’ para a tela anterior com o ID para poder fazer o select(via JPA) e fazer as modificações que eu preciso.
Ok, aos códigos:

No meu botão Confirmar da tela de Pesquisa eu tentei de 2 formas:

  1. Usando um executeQuery:

    private void retorna_busca(){
    
    if (!frmPesqIbge.getLbIdPesq().getText().equals("")){
    
    IbgeActionListener ibgeActionListener = new IbgeActionListener();
    
    ibgeActionListener.recebeRetornoPesq(Long.parseLong(frmPesqIbge.getLbIdPesq().getText()));
    
    frmPesqIbge.dispose();
    
    }else{
    
    JOptionPane.showMessageDialog(frmPesqIbge, Não achou o ID);
    
    }
    
    }
    

A chamada recebeRetornoPesq está assim:

public void recebeRetornoPesq(Long numId) {
        IbgeDAO dao = new IbgeDAO();
        List<Ibge> lista = null;
        String query = "Select i from Ibge i where i.id = ?1";
        lista = (List<Ibge>) dao.executeQuery(query, numId);
        doBancoParaForm((Ibge) lista);
    }

E o meu executeQuery está básico:

public Object executeQuery(String query, Object... params) {
        Query createdQuery = this.entityManager.createQuery(query);
        for (int i = 0; i < params.length; i++) {
            createdQuery.setParameter(i+1, params[i]);
        }
        return createdQuery.getResultList();
    }
  1. Usando um NamedQuery:

    public List listaIbgePorId(Long numId) {
    
    return (List) getEntityManager().createNamedQuery(ibge.porId)
    
    .setParameter(1, numId)
    
    .getSingleResult();
    
    }
    

    @NamedQuery(name = “ibge.porId”, query = “Select i from Ibge i where i.id = ?1”)

    public void recebeRetornoPesq(Long numId) {
    
    IbgeDAO dao = new IbgeDAO();
    
    List lista = null;
    
    String query = Select i from Ibge i where <a href="http://i.id">i.id</a> = ?1;
    
    lista =  (List) dao.listaIbgePorId(numId);
    
    doBancoParaForm((Ibge) lista);
    
    }
    

Ambos eu estou tendo este retorno:

Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: java.util.ArrayList cannot be cast to br.sysurna.model.Ibge

Onde eu estou errando, conseguem ajudar?

11 Respostas

F

Melhorando o erro:

O erro acontece nesse momento:

lista = (List<Ibge>) dao.listaIbgePorId(numId);

E recompilando e tentando de novo o erro completo:

Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: br.sysurna.model.Ibge cannot be cast to java.util.List

pmlm

Este método devolve um Object e não uma List
O erro é neste cast

return (List<Ibge>) getEntityManager().createNamedQuery("ibge.porId")
            .setParameter(1, numId)
            .getSingleResult();
F

@pmlm.
Funcionou, consegui o retorno que eu queria.

Agora tive só um outro pequeno problema. No meu set para o frm não está setando os valores.
Eu até dei um SystemOut para ver eles e, todos estão vindo, porém, não estão ficando nos seus respectivos campos.
Olha como eu fiz:

public void recebeRetornoPesq(Long numId) {
        Object objeto;
        IbgeDAO dao = new IbgeDAO();
        Ibge ibge;
        frmCadIBGE novo = new frmCadIBGE();
       
        String query = "Select i from Ibge i where i.id = ?1";
        objeto = dao.listaIbgePorId(numId); //Aqui eu pego o retorno da função
        ibge = (Ibge) objeto; //Aqui eu convertendo para o tipo
        novo.getLbId().setText(Long.toString((ibge.getId()))); //Aqui eu começando a setar os valores no frm.
        //frm.getLbId().setVisible(false);
        novo.getTxtCodigo().setText(ibge.getCodigo());
        novo.getTxtCidade().setText(ibge.getCidade());
        novo.getCmbEstado().setSelectedItem(ibge.getEstado());
        novo.getTxtPopulacao().setText(ibge.getPopulacao());
        novo.getTxtRegiao().setText(ibge.getRegiao());
        novo.getTxtQtdeFunerarias().setText(ibge.getQtdFunerarias());
        novo.getTxtEstimativaObitos().setText(ibge.getEstimativaObitos());        

    }

Por eu instanciar de novo a classe do cadastro, por um acaso ela ‘perde’ a referencia?(Não consigo achar outra explicação para isso).

Consegue ajudar?

Obrigado.

F

Só reforçando:

A idéia é:
ter um botão de pesquisa na tela de cadastro que abre a tela de pesquisa. OK
Funcionar o filtro de pesquisa dentro da tela de pesquisa(com a tela de cadastro aberta ainda). OK
Ter um botão que confirma a volta da informação que eu escolhi da tela de pesquisa para a tela de cadastro e fechar a tela de pesquisa(funcionando parcialmente, a informação chega no método e a tela de pesquisa é fechada).
A tela de cadastro receber a informação da pesquisa. Não OK.

F
novo.getLbId().setText(Long.toString(ibge.getId()));
System.out.println("ID dentro do campo = " + novo.getLbId().getText());
novo.getTxtCidade().setText(ibge.getCidade());
System.out.println("cidade dentro do campo = " + novo.getTxtCidade().getText());

Usando o código acima, entendo eu que ‘setei’ a informação para o que eu quero e o SystemOut me mostra e comprova isso.
Só que visualmente, na tela, não é mostrado.

F

E utilizando desta forma:

public void recebeRetornoPesq(Long numId) {
        Object objeto;
        IbgeDAO dao = new IbgeDAO();
        Ibge ibge;
        this.frm = frm;
        String query = "Select i from Ibge i where i.id = ?1";
        objeto = dao.listaIbgePorId(numId);
        ibge = (Ibge) objeto;
        frm.getLbId().setText(Long.toString(ibge.getId()));
        frm.getTxtCidade().setText(ibge.getCidade());
        
    }

Recebo erro de NullPointerException:

Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
at br.sysurna.controller.IbgeActionListener.recebeRetornoPesq(IbgeActionListener.java:48)

Essa linha é essa aqui:

frm.getLbId().setText(Long.toString(ibge.getId()));

Desculpe o flood, é que vou atualizando aqui conforme os meus testes.

pmlm

Estou perdido. Podes postar como tens todo o código agora? :slight_smile:

F

@pmlm desculpe.
Segue abaixo:

Essa aqui é da tela de cadastro:

package br.sysurna.controller;

import br.sysurna.model.Ibge;
import br.sysurna.model.IbgeDAO;
import br.sysurna.view.TelaPrincipal;
import br.sysurna.view.frmCadIBGE;
import br.sysurna.view.frmPesquisaIbge;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;

/**
 *
 * @author Victor Freidinger
 */
public final class IbgeActionListener implements ActionListener {

    private frmCadIBGE frm;

    public IbgeActionListener(frmCadIBGE frm) {
        this.frm = frm;
        adicionarListener();
    }

    IbgeActionListener() {
        this.frm = null;
    }

    public void recebeRetornoPesq(Long numId) {
        Object objeto;
        IbgeDAO dao = new IbgeDAO();
        Ibge ibge;
        this.frm = frm;
        String query = "Select i from Ibge i where i.id = ?1";
        objeto = dao.listaIbgePorId(numId);
        ibge = (Ibge) objeto;
        System.out.println("frm getLbId antes setar = " + frm.getLbId());
        System.out.println("frm getTxtCidade antes setar = " + frm.getTxtCidade().getText());
        frm.getLbId().setText(Long.toString(ibge.getId()));
        System.out.println("ID dentro do campo = " + frm.getLbId().getText());
        frm.getTxtCidade().setText(ibge.getCidade());
        System.out.println("cidade dentro do campo = " + frm.getTxtCidade().getText());
        

    public void adicionarListener() {
        frm.getBtIncluir().addActionListener(this);
        frm.getBtAlterar().addActionListener(this);
        frm.getBtExcluir().addActionListener(this);
        frm.getBtSalvar().addActionListener(this);
        frm.getBtCancelar().addActionListener(this);
        frm.getBtPesquisar().addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent evento) {

        switch (evento.getActionCommand()) {
            case "Incluir":
                Incluir();
                break;
            case "Alterar":
                Alterar();
                break;
            case "Excluir":
                Excluir();
                break;
            case "Salvar":
                Salvar();
                break;
            case "Cancelar":
                Cancelar();
                break;
            case "Pesquisar":
                Pesquisar();
                break;
            default:
                break;
        }

    }

    private void Pesquisar() {
        frmPesquisaIbge pesquisaIbge = new frmPesquisaIbge();
        TelaPrincipal.FrmDesktopPrinc.add(pesquisaIbge);
        pesquisaIbge.setVisible(true);
        
    }
    
}

Meu frmPesquisaIbge na chamada do método Pesquisar:

public frmPesquisaIbge() {
        initComponents();
        pesqListener = new PesqIbgeActionListener(this);
    }

Meu PesqIbgeActionListener:

package br.sysurna.controller;

import br.sysurna.model.Ibge;
import br.sysurna.model.IbgeDAO;
import br.sysurna.view.frmPesquisaIbge;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
 *
 * @author Victor Freidinger
 */
public final class PesqIbgeActionListener implements ActionListener, ListSelectionListener {

    private final frmPesquisaIbge frmPesqIbge;
    private PesqIbgeTableModel pesqIbgeTableModel;

    public PesqIbgeActionListener(frmPesquisaIbge frmPesqIbge) {
        this.frmPesqIbge = frmPesqIbge;
        adicionarListener();
    }

    public void adicionarListener() {
        frmPesqIbge.getBtPesquisar().addActionListener(this);
        frmPesqIbge.getBtConfirmarPesq().addActionListener(this);
        frmPesqIbge.getBtCancelarPesq().addActionListener(this);

    }

    @Override
    public void actionPerformed(ActionEvent evento) {
        switch (evento.getActionCommand()) {
            case "Pesquisar":
                preenche_lista();
                break;
            case "Confirmar":
                retorna_busca();
                break;
            case "Cancelar":
                frmPesqIbge.dispose();
                break;
            default:
                break;
        }
    }
    
    private void retorna_busca(){
        if (!frmPesqIbge.getLbIdPesq().getText().equals("")){
            IbgeActionListener ibgeActionListener = new IbgeActionListener();
            ibgeActionListener.recebeRetornoPesq(Long.parseLong(frmPesqIbge.getLbIdPesq().getText())); //Aqui eu chamo a classe ActionListener do cadastro principal
            frmPesqIbge.dispose();
        }else{
            JOptionPane.showMessageDialog(frmPesqIbge, "Não achou o ID");
        }
            
    }
    

    private void preenche_lista() {

        IbgeDAO dao = new IbgeDAO();
        List<Ibge> lista = null;
        String query = "Select i from Ibge i where upper(i.estado) = ?1";

        if (!frmPesqIbge.getTxtCodigoPesq().getText().equals("")) {
            if (!frmPesqIbge.getTxtCidadePesq().getText().equals("")) {
                query = query + " and upper(i.codigo) like concat(?2, '%') and upper(i.cidade) like concat(?3, '%') ";
                lista = (List<Ibge>) dao.executeQuery(query, frmPesqIbge.getCmbEstadoPesq().getSelectedItem(), frmPesqIbge.getTxtCodigoPesq().getText().toUpperCase(), frmPesqIbge.getTxtCidadePesq().getText().toUpperCase());
            } else {
                query = query + " and upper(i.codigo) like concat(?2, '%')";
                lista = (List<Ibge>) dao.executeQuery(query, frmPesqIbge.getCmbEstadoPesq().getSelectedItem(), frmPesqIbge.getTxtCodigoPesq().getText().toUpperCase());
            }
        } else if (!frmPesqIbge.getTxtCidadePesq().getText().equals("")) {
            query = query + " and upper(i.cidade) like concat(?2, '%') ";
            lista = (List<Ibge>) dao.executeQuery(query, frmPesqIbge.getCmbEstadoPesq().getSelectedItem(), frmPesqIbge.getTxtCidadePesq().getText().toUpperCase());
        } else {
            lista = (List<Ibge>) dao.executeQuery(query, frmPesqIbge.getCmbEstadoPesq().getSelectedItem());
        }

        pesqIbgeTableModel = new PesqIbgeTableModel(lista);
        frmPesqIbge.getTbListaPesq().setModel(pesqIbgeTableModel);
        limpaCampos();
        frmPesqIbge.getTbListaPesq().getSelectionModel().addListSelectionListener(this);
    }

    @Override
    public void valueChanged(ListSelectionEvent e) {
        int s;
        s = frmPesqIbge.getTbListaPesq().getSelectedRow();
        if (s != -1) {
            Ibge ibge = new Ibge();
            ibge = pesqIbgeTableModel.getLinhas().get(s);
            doBancoParaForm(ibge);
        }
    }

}

Não sei se é a forma mais correta de se desenvolver, porém, é a forma que eu consegui fazer. Se houver melhorias e puder me passar elas, eu agradeço e muito.
Obrigado.

pmlm

Tens tudo muito confuso. Há regras básicas que deves ter em conta, senão quando a tua aplicação crescer um pouco mais fica impossível de manter:

  • Nomes de classes sempre com primeira letra maiúscula (frmPesquisaIbge deveria ser FrmPesquisaIbge)
  • Nomes de métodos e variáveis sempre com primeria letra minúscula e em camelCase (por exemplo Pesquisar ou Incluir deveriam ser pesquisar e incluir e retorna_busca deve ser retornaBusca)
  • A visualização deve estar sempre bem separada da estrutura de dados. Não deves ter queries nas tuas Frames / Listeners, somente nos dao. A unica coisa que ambas as camadas conhecem são as entidades.
  • Os métodos devem ter nomes sugestivos sobre o que fazem. Um método retorna_busca que não retorna nada ou tem o nome errado ou está mal implementado
F

Oi @pmlm Obrigado pelo seu retorno.

  1. Ok, vou me policiar pelos nomes. Vou alterar essas minhas 2 classes(apenas as de frm que eu coloquei dessa forma).
  2. retorna_busca eu já alterei para retornaBusca, vi isso assim que postei aqui. É o meu costume ao criar funções em branco, desculpe.
  3. Ok,essa parte vou me policiar melhor também. Sò lembrando também que eu utilizei o executeQuery que está no dao e não direto na Listener.
  4. Ok, vou tentar me policiar melhor também. Para este exemplo, vou alterar para retornaBuscaId.

Fora essa melhoria referente a implementações, tem algo a me informar por qual motivo não aparece as informações na tela?

Obrigado.

pmlm

Revendo todas as tuas respostas, isto me chamou a atenção. Como instanciar de novo? Tens duas instâncias, fazes set em uma e o get em outra? Assim é obvio que não funciona.

Criado 9 de agosto de 2016
Ultima resposta 12 de ago. de 2016
Respostas 11
Participantes 2