[RESOLVIDO]Refresh da TableModel

5 respostas Resolvido
java
F

Olá pessoal,

Eu tenho uma tela onde tenho uma grid(JScrollPane) onde mostro os dados da tabela e conforme eu clico na linha, os campos são preenchidos no form.
Está funcionando sem problemas.
O que eu estou com problemas:
Quando eu faço uma inserção, atualização ou delete de um registro, não está dando o ‘refresh’ no grid.
No caso do update, se eu clico na linha novamente, o grid ‘se dá’ o refresh e atualiza os dados.
O código é bem extenso, eu não sei o que exatamente mostrar aqui, mas, posso colocar se necessário todo o código.
O que eu estou fazendo:
No frm, chamo uma classe Listener para mostrar os botões(salvar, incluir, etc).
Dentro dessa chamada ainda, eu tenho um método que inicializa o TableModel:

public void inicializaTableModel() {
            IbgeDAO dao = new IbgeDAO();
            List<Ibge> lista = dao.findAll();
            ibgeTableModel = new IbgeTableModel(lista);
        try {
            frm.getTbListaIbge().setModel(ibgeTableModel);
        } catch (Exception e) {
            System.out.println("erro message = " + e.getMessage());
        }
        frm.getTbListaIbge().getSelectionModel().addListSelectionListener(this);
    }

E tenho também um Override do método valueChanged:

@Override
    public void valueChanged(ListSelectionEvent evento) {

        Ibge ibge = ibgeTableModel.getLinhas().get(frm.getTbListaIbge().getSelectedRow());
        doBancoParaForm(ibge);
    }

Eu fazendo o debug(vcs não tem idéia, eu joguei SystemOut em tudo), quando eu abro a tela, não é passado pelo valueChanged.
Quando eu clico em uma linha do grid, é passado por ele, mas, não houve alteração nenhuma.
Agora quando eu faço uma alteração e salvo e ai dispara o método, no getMessage do Exception me vem como ‘-1’.
Não sei se é o motivo, mas, isso acontece porque, depois do método salvar, eu chamo o próprio método de inicializarTableModel, pensando que se eu chamo ‘ele mesmo’ já vem com a atualização.

Alguém poderia me ajudar a compreender onde estou fazendo errado e ajudar a solucionar este problema?

Aqui tem a imagem da tela para ajudar no exemplo:

Obrigado.

5 Respostas

F

Só um adicional.

Isso aqui:

@Override
    public void valueChanged(ListSelectionEvent evento) {
        Ibge ibge = null;
        try {
            ibge = ibgeTableModel.getLinhas().get(frm.getTbListaIbge().getSelectedRow());
        } catch (Exception e) {
            System.out.println("erro no final = " + e.getMessage());
            System.out.println("erro 2 no final = " + e.getLocalizedMessage());
        }

        doBancoParaForm(ibge);
    }

Tá me dando este retorno:

erro no final = -1
erro 2 no final = -1
F

Pessoal,

Eu fiz uma ‘quebra’ dentro do valueChanged:

@Override
    public void valueChanged(ListSelectionEvent evento) {
        Ibge ibge = null;
        try {
            
            int s;
            System.out.println("rows = " + Arrays.toString(frm.getTbListaIbge().getSelectedRows()));
            s = frm.getTbListaIbge().getSelectedRow();
            System.out.println("S = " + s);
            Ibge i;
            i = ibgeTableModel.getLinhas().get(s);
            System.out.println("getLinhas = " + ibgeTableModel.getLinhas());
            System.out.println("I = " + i);
            ibge = i;
        } catch (Exception e) {
            System.out.println("erro no final = " + e.getMessage());
            System.out.println("erro 2 no final = " + e.getLocalizedMessage());
        }

        doBancoParaForm(ibge);
    }

E o meu retorno:

rows = []
S = -1

Entendi que, no momento da listagem, eu tenho informações.
Já, no momento que eu faço a alteração, eu não sei por qual motivo, fica ‘limpa’ a listagem.

Como proceder?

Eslley

No caso do refresh, eu estava fazendo um programinha e também me deparei com isso.
A solução que fiz deu certo, eu criei primeiro a função que puxava os dados do banco de dados e setava eles todos na tabela(usei uma biblioteca para isso link de download(http://pt.osdn.jp/projects/sfnet_finalangelsanddemons/downloads/rs2xml.jar/)).Depois nas funções que fazia a inserção,atualização e delete eu testava se os comandos tinha ocorrido com sucesso,se sim eu chamava o método que puxa os dados do banco de dados.

CÓDIGO DO MEU PROGRAMA:

public void atualizar_adicionar(){ //FUNÇÃO DO REFRESH
    String asql = "select codigo_lanche as 'Código do lanche',nome as 'Nome do lanche',preco as Preço from lanches";
                try {
                    pst = conexao.prepareStatement(asql);
                    rs = pst.executeQuery();
                    tblLanches.setModel(DbUtils.resultSetToTableModel(rs)); //AQUI É  USADA A BIBLIOTECA
                } catch (Exception e) {
                    JOptionPane.showMessageDialog(null, e);
                }
}


private void adicionar() {
    String sql = "insert into lanches(nome,preco) values (?,?);";
    try {
        pst = conexao.prepareStatement(sql);
        pst.setString(1, txtNomeLanche.getText());
        pst.setString(2, txtPreco.getText().replace(",", "."));
        if (txtNomeLanche.getText().isEmpty() || txtPreco.getText().isEmpty()) {
            JOptionPane.showMessageDialog(null, "Preencha todos os campos");
        } else {
            int adicionado = pst.executeUpdate();
            if (adicionado > 0) {
                JOptionPane.showMessageDialog(null, "Lanche adicionado com sucesso");
                txtNomeLanche.setText(null);
                txtPreco.setText("0");
                txtC.setText("0");
                atualizar_adicionar(); //ISSO FAZ O REFRESH
            }
        }
    } catch (java.sql.SQLException e) {
        JOptionPane.showMessageDialog(null, "Digite números e só é aceito uma vírgula");
    } catch (Exception e1) {
        JOptionPane.showMessageDialog(null, e1);
    }
}

Espero ter ajudado

F

Oi @Eslley,

Obrigado pelo retorno.
Isso ai eu tenho já:

private void Salvar() {
        if (validarCampos() == true) {
            try {
                IbgeDAO dao = new IbgeDAO();
                if ("".equals(frm.getLbId().getText())) {
                    dao.salvar(doFormParaBanco()); //Aqui eu chamo o processo de salvar
                    JOptionPane.showMessageDialog(frm, "IBGE Cadastrado!");
                } else {
                    dao.update(doFormParaBanco()); //Aqui eu chamo o processo de alterar(vou refazer e deixar os 2 em 1 só
                    JOptionPane.showMessageDialog(frm, "IBGE Alterado!");
                }
                desabilitaSalvar();
                frm.limparCampos();

            } catch (Exception ex) {
                System.out.println("message = " + ex.getMessage());
            }
            bloqueiaCampos();
            
        }
        inicializaTableModel(); //Aqui fora já eu chamo o processo de refresh

    }

Mas, obrigado pelo seu retorno.

F
Solucao aceita

Pessoal,

Eu encontrei a resposta:
Quando eu faço uma alteração(essa parte eu ainda não sei o motivo), eu ‘deixo de selecionar’ uma linha.
Então o valueChanged vem em branco(o getSelectedRow vem como -1).
Então, o que eu fiz: Joguei um if: (if s != -1) faz o que tem que fazer, no caso popular os dados no frm, senão, não faz nada.
Como eu já fiz a listagem lá em cima, antes de chamar o setTableModel, já tenho a listagem.
Eu não sei explicar exatamente o motivo de perder o ‘selecionado’, mas, foi isso que ocorreu.

Edit(código):

@Override
    public void valueChanged(ListSelectionEvent evento) {
        Ibge ibge;
        int s;
        s = frm.getTbListaIbge().getSelectedRow();
        if (s != -1) {
            Ibge i;
            i = ibgeTableModel.getLinhas().get(s);
            ibge = i;
            doBancoParaForm(ibge);
        }

    }
Criado 4 de agosto de 2016
Ultima resposta 4 de ago. de 2016
Respostas 5
Participantes 2