Removendo do BD Registros selecionados em um AbstractTableModel?

18 respostas
BtAquino

Bom dia

Estou praticando também GUI Swing e decidir usar o AbstractTableModel sugerido pelo Fórum.

Encontrei um método que remove as linhas selecionadas da tabela

int selecionados[] = jTable1.getSelectedRows();
        if (selecionados.length > 0) {
            List<Cidade> seraoExcluidos = new ArrayList<Cidade>();

            for (int i = 0; i < selecionados.length; i++) {
                seraoExcluidos.add(model.getCidade(selecionados[i]));
            }

            for (Cidade c : seraoExcluidos) {
                model.excluir(c);
            }

        } else {
            JOptionPane.showMessageDialog(this, "Selecione um Registro...");
        }

Agora preciso remover do banco de dados as linhas selecionadas.

Meu Dao:

public void remove(Cidade cidade){ String sql = "delete from cidade where idCidade = ?"; try{ PreparedStatement stmt = connection.prepareStatement(sql); stmt.setLong(1, cidade.getIdCidade()); stmt.execute(); stmt.close(); }catch(SQLException e){ throw new RuntimeException(e); } }

Pesquisei no fórum, e achei um tópico que sugere a seguinte maneira.

criar um método :

public Cidade get(int row) { return cidade.get(row); }

Depois usar :

Cidade c = model.get(jTable1.getSelectedRow()); dao.remove(c);

Mas não funcionou.

Alguém tem outra maneira? ou pode me ajudar ?

Obrigado!

18 Respostas

P

Da uma pesquisada em Hibernat(persistência de dados) e BeansBinding (vinculação de atributos com componentes gráficos)

Se interessar me mande um e-mail ([email removido]) que te mando algum material ou dicas

F

Assim não funciona?

int selecionados[] = jTable1.getSelectedRows();
        if (selecionados.length > 0) {
            List<Cidade> seraoExcluidos = new ArrayList<Cidade>();

            for (int i = 0; i < selecionados.length; i++) {
                seraoExcluidos.add(model.getCidade(selecionados[i]));
            }

            for (Cidade c : seraoExcluidos) {
                model.excluir(c);
                dao.remove(c); // MODIFICAÇAO AQUI
            }

        } else {
            JOptionPane.showMessageDialog(this, "Selecione um Registro...");
        }
BtAquino

felipeaps:
Assim não funciona?

int selecionados[] = jTable1.getSelectedRows();
        if (selecionados.length > 0) {
            List<Cidade> seraoExcluidos = new ArrayList<Cidade>();

            for (int i = 0; i < selecionados.length; i++) {
                seraoExcluidos.add(model.getCidade(selecionados[i]));
            }

            for (Cidade c : seraoExcluidos) {
                model.excluir(c);
                dao.remove(c); // MODIFICAÇAO AQUI
            }

        } else {
            JOptionPane.showMessageDialog(this, "Selecione um Registro...");
        }

Tentei assim também e acontece o seguinte erro:

BtAquino

paulo_alonso:
Da uma pesquisada em Hibernat(persistência de dados) e BeansBinding (vinculação de atributos com componentes gráficos)

Se interessar me mande um e-mail ([email removido]) que te mando algum material ou dicas

Mandei o email :smiley:

mas neste caso estou praticando com JDBC puro mesmo.

F

Onde que ta dando essa excessão?

Vc tirou isso né?

Cidade c = model.get(jTable1.getSelectedRow()); dao.remove(c);

BtAquino

felipeaps:
Onde que ta dando essa excessão?

Vc tirou isso né?

Cidade c = model.get(jTable1.getSelectedRow()); dao.remove(c);

Tirei o trecho citado sim.

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at dao.CidadeDao.remove(CidadeDao.java:63) at view.ListaDeClientesView.jButton3ActionPerformed(ListaDeClientesView.java:145) at view.ListaDeClientesView.access$100(ListaDeClientesView.java:18) at view.ListaDeClientesView$2.actionPerformed(ListaDeClientesView.java:78) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.Component.processMouseEvent(Component.java:6268) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:6033) at java.awt.Container.processEvent(Container.java:2045) at java.awt.Component.dispatchEventImpl(Component.java:4629) at java.awt.Container.dispatchEventImpl(Container.java:2103) at java.awt.Component.dispatchEvent(Component.java:4455) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4633) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4297) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4227) at java.awt.Container.dispatchEventImpl(Container.java:2089) at java.awt.Window.dispatchEventImpl(Window.java:2517) at java.awt.Component.dispatchEvent(Component.java:4455) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:649) at java.awt.EventQueue.access$000(EventQueue.java:96) at java.awt.EventQueue$1.run(EventQueue.java:608) at java.awt.EventQueue$1.run(EventQueue.java:606) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116) at java.awt.EventQueue$2.run(EventQueue.java:622) at java.awt.EventQueue$2.run(EventQueue.java:620) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) at java.awt.EventQueue.dispatchEvent(EventQueue.java:619) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177) at java.awt.EventDispatchThread.run(EventDispatchThread.java:138) Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at dao.CidadeDao.remove(CidadeDao.java:63) at view.ListaDeClientesView.jButton3ActionPerformed(ListaDeClientesView.java:145) at view.ListaDeClientesView.access$100(ListaDeClientesView.java:18) at view.ListaDeClientesView$2.actionPerformed(ListaDeClientesView.java:78) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.Component.processMouseEvent(Component.java:6268) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:6033) at java.awt.Container.processEvent(Container.java:2045) at java.awt.Component.dispatchEventImpl(Component.java:4629) at java.awt.Container.dispatchEventImpl(Container.java:2103) at java.awt.Component.dispatchEvent(Component.java:4455) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4633) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4297) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4227) at java.awt.Container.dispatchEventImpl(Container.java:2089) at java.awt.Window.dispatchEventImpl(Window.java:2517) at java.awt.Component.dispatchEvent(Component.java:4455) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:649) at java.awt.EventQueue.access$000(EventQueue.java:96) at java.awt.EventQueue$1.run(EventQueue.java:608) at java.awt.EventQueue$1.run(EventQueue.java:606) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116) at java.awt.EventQueue$2.run(EventQueue.java:622) at java.awt.EventQueue$2.run(EventQueue.java:620) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) at java.awt.EventQueue.dispatchEvent(EventQueue.java:619) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177) at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

F

Bom, ta dando nullPointer porque provavelmente o “c” que vc está passando para o método remove é null.

Verifica seu método getCidade e ve se ele não ta devolvendo null.

verifica também o conteúdo do arrayList seraoExcluidos.

BtAquino

Meu método de lista que alimenta a tabela é este:

public List<Cidade> getLista() { try { List<Cidade> cidades = new ArrayList<Cidade>(); PreparedStatement stmt = connection.prepareStatement("select * from cidade"); ResultSet rs = stmt.executeQuery(); while (rs.next()) { Cidade cidade = new Cidade(); cidade.setNomeCidade(rs.getString("nomeCidade")); cidade.setUf(rs.getString("uf")); cidades.add(cidade); } rs.close(); stmt.close(); return cidades; } catch (SQLException e) { throw new RuntimeException(e); } }

F

Não, não.

Método getCidade, que é quando vc seleciona uma linha da tabela e ele te retorna o objeto cidade. O erro deve estar ai.

BtAquino

Não estou conseguindo achar o problema.

Só excluiu mesmo as linhas da tabela, mas não estou conseguindo fazer a exclusão do banco.

tentei assim tbm

for (Cidade c : seraoExcluidos) { model.excluir(c); dao.getLista().remove(c); }

F

Cara, olha a excessão;

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException  
    at dao.CidadeDao.remove(CidadeDao.java:63)

O problema é que o método remove ta recebendo uma referência nula entendeu?

BtAquino

Isso eu entendi, o que eu não estou conseguindo fazer, é fazer como que meu dao.remove receba as linhas selecionadas da tabela, para excluir do banco.

tentei assim também:

CidadeDao:

public void removeItensTabela(Long id) {
        try{
        PreparedStatement stm = connection.prepareStatement("DELETE FROM cidade WHERE id = ?");
        stm.setLong(1, id);
        stm.execute();
        }catch(SQLException e){
            throw  new RuntimeException(e);
        }
        
    }

CidadeTableModel:

public Cidade get(int row) {
        return cidade.get(row);
    }

ListaDeClientesView

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {

        /*
         * linhas
         */
        int selecionados[] = jTable1.getSelectedRows();
        if (selecionados.length > 0) {
            List<Cidade> seraoExcluidos = new ArrayList<Cidade>();

            for (int i = 0; i < selecionados.length; i++) {
                seraoExcluidos.add(model.get(selecionados[i]));
                
                
                

            }

            for (Cidade c : seraoExcluidos) {
                model.excluir(c);
                new CidadeDao().removeItensTabela(c.getIdCidade());
              //  jTable1.removeRow(model.get(selecionados[i]));
            }



        } else {
            JOptionPane.showMessageDialog(this, "Selecione um Registro...");
        }
F
BtAquino:
Isso eu entendi, o que eu não estou conseguindo fazer, é fazer como que meu dao.remove receba as linhas selecionadas da tabela, para excluir do banco.

tentei assim também:

CidadeDao:

public void removeItensTabela(Long id) {
        try{
        PreparedStatement stm = connection.prepareStatement("DELETE FROM cidade WHERE id = ?");
        stm.setLong(1, id);
        stm.execute();
        }catch(SQLException e){
            throw  new RuntimeException(e);
        }
        
    }

CidadeTableModel:

public Cidade get(int row) {
        return cidade.get(row);
    }

ListaDeClientesView

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {

        /*
         * linhas
         */
        int selecionados[] = jTable1.getSelectedRows();
        if (selecionados.length > 0) {
            List<Cidade> seraoExcluidos = new ArrayList<Cidade>();

            for (int i = 0; i < selecionados.length; i++) {
                seraoExcluidos.add(model.get(selecionados[i]));
                
                
                

            }

            for (Cidade c : seraoExcluidos) {
                model.excluir(c);
                new CidadeDao().removeItensTabela(c.getIdCidade());
              //  jTable1.removeRow(model.get(selecionados[i]));
            }



        } else {
            JOptionPane.showMessageDialog(this, "Selecione um Registro...");
        }

Continua dando nullPointerException? Se sim é o que estou tentando te falar.

Se deu NullPointerException no removeItensTabela é porque sei "id" é null. Se seu "id" é null, seu c.getIdCidade() ta retornando null.
Se o getIdCidade retorna null, ou o campo id da classe Cidade ta null, ou o "c" tá null;

Vc ta fazendo alteração onde não tem erro, o erro é mais em cima (ou em baixo, depende do ponto de vista =P)! Tendeu? =P

Pelo menos é o que eu acho haha

BtAquino

Sim entendi, mas ai que está o problema.

Mesmo sabendo o motivo do erro, eu não consigo passar para meu dao.remove os id dos registros selecionados na tabela.

Por acaso não tem um exemplo de código?

To vendo que vou ter problemas na hora de mexer no método que Altera :lol:

F

Debuga o código.

essa parte:

esse método deve retornar um objeto Cidade concorda?

Ele tá retornando isso, ou simplesmente tá retornando null?

Pra descobrir onde tá o erro vc tem que ir dubugando seu código, senão não rola.

Faz o seguinte, depois desse for que adiciona no array poe isso:

for (Cidade d : seraExcluidos) { System.out.println("ID: " + d.getIdCidade); }

Posta a saída.

BtAquino

Adicionei duas imagens de degub, se poder da uma olhada fico grato




F

Não é isso não, quero saber a saida do for que te passei.

for (Cidade d : seraExcluidos) { System.out.println("ID: " + d.getIdCidade); }

O que ele escreve no console?

A

Cara eu faço assim tenho minha classe TableModel com este código:

package br.com.despesa.tablemodels;

import br.com.despesa.beans.Despesa;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;

public class DespesaTableModel extends AbstractTableModel {
    //private String[] colunas = {"Código","Nome","Endereço","Bairro","Cidade","Estado","RG","CPF","Telefone","Celular","Email","Data de Nascimento"};

    //constantes que vão representar as colunas  
    //(só para facilitar o entendimento do código)  
    private final int codigo = 0;
    private final int despesa = 1;
    private final int estabelecimento = 2;
    private final int data = 3;
    private final int mes = 4;
    private final int valor = 5;
    private final int formadepagamento = 6;
    private final int cartao = 7;
    private final int datacheque = 8;
    private final int numerocheque = 9;
    //lista dos produtos que serão exibidos  
    private List<Despesa> produtos;

    public DespesaTableModel() {
        produtos = new ArrayList<Despesa>();
    }

    public DespesaTableModel(java.util.List<br.com.despesa.beans.Despesa> lista) {
        this();
        produtos.addAll(lista);
    }

    public int getRowCount() {
        //cada produto na lista será uma linha  
        return produtos.size();
    }

    public int getColumnCount() {
        //vamos exibir só Nome e Quantidade, então são 2 colunas  
        return 9;
    }

    @Override
    public String getColumnName(int column) {
        //qual o nome da coluna  
        if (column == codigo) {
            return "Código";
        } else if (column == despesa) {
            return "Despesa";
        } else if (column == estabelecimento) {
            return "Estabelecimento";
        } else if (column == data) {
            return "Data da Despesa";
        } else if (column == mes) {
            return "Mês";
        } else if (column == valor) {
            return "Valor da Despesa";
        } else if (column == formadepagamento) {
            return "Forma de Pagamento";
        } else if (column == cartao) {
            return "Cartão";
        } else if (column == datacheque) {
            return "Data do Cheque";
        } else if (column == numerocheque) {
            return "Numero do Cheque";
        }
        return "";
    }

    @Override
    public Class getColumnClass(int columnIndex) {
        //retorna a classe que representa a coluna  
        if (columnIndex == codigo) {
            return Integer.class;
        } else if (columnIndex == despesa) {
            return String.class;
        } else if (columnIndex == estabelecimento) {
            return String.class;
        } else if (columnIndex == data) {
            return String.class;
        } else if (columnIndex == mes) {
            return String.class;
        } else if (columnIndex == valor) {
            return String.class;
        } else if (columnIndex == formadepagamento) {
            return String.class;
        } else if (columnIndex == cartao) {
            return String.class;
        } else if (columnIndex == datacheque) {
            return String.class;
        } else if (columnIndex == numerocheque) {
            return String.class;
        }
        return String.class;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        //pega o produto da linha  
        Despesa p = produtos.get(rowIndex);

        //verifica qual valor deve ser retornado  
        if (columnIndex == codigo) {
            return p.getCodigo();
        } else if (columnIndex == despesa) {
            return p.getDespesa();
        } else if (columnIndex == estabelecimento) {
            return p.getEstabelecimento();
        } else if (columnIndex == data) {
            return p.getDatadespesa();
        } else if (columnIndex == mes) {
            return p.getMes();
        } else if (columnIndex == valor) {
            return p.getValor();
        } else if (columnIndex == formadepagamento) {
            return p.getFormadepagamento();
        } else if (columnIndex == cartao) {
            return p.getCartao();
        } else if (columnIndex == datacheque) {
            return p.getDatacheque();
        } else if (columnIndex == numerocheque) {
            return p.getNumerocheque();
        }
        return "";
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        //no nosso caso todas vão ser editáveis, entao retorna true pra todas  
        return true;
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        //pega o produto da linha  
        Despesa p = produtos.get(rowIndex);

        //verifica qual valor vai ser alterado  
        if (columnIndex == codigo) {
            JOptionPane.showMessageDialog(null, "Campo código não pode ser alterado");
        } else if (columnIndex == despesa) {
            p.setDespesa(aValue.toString());
        } else if (columnIndex == estabelecimento) {
            p.setEstabelecimento(aValue.toString());
        } else if (columnIndex == data) {
            p.setDatadespesa(aValue.toString());
        } else if (columnIndex == mes) {
            p.setMes(aValue.toString());
        } else if (columnIndex == valor) {
            p.setValor(aValue.toString());
        } else if (columnIndex == formadepagamento) {
            p.setFormadepagamento(aValue.toString());
        } else if (columnIndex == cartao) {
            p.setCartao(aValue.toString());
        } else if (columnIndex == datacheque) {
            p.setDatacheque(aValue.toString());
        } else if (columnIndex == numerocheque) {
            p.setNumerocheque(aValue.toString());
        }
        //avisa que os dados mudaram  
        fireTableDataChanged();
    }

    //-----------------------------------------------------  
    //Métodos personalizados  
    //-----------------------------------------------------  
    public void inserir(Despesa p) {
        produtos.add(p);

        fireTableDataChanged();
    }

    public void excluir(int pos) {
        produtos.remove(pos);

        fireTableDataChanged();
    }

    public void excluir(Despesa p) {
        produtos.remove(p);

        fireTableDataChanged();
    }

    public void ordenarPorValor() {
        //ordena pelo nome  
        Collections.sort(produtos, new Comparator<Despesa>() {

            @Override
            public int compare(Despesa o1, Despesa o2) {
                return o1.getDatadespesa().compareTo(o2.getDatadespesa());
            }
        });
        //avisa que a tabela foi alterada  
        fireTableDataChanged();
    }

    public void misturar() {
        //mistura a lista  
        Collections.shuffle(produtos);

        //avisa que a tabela foi alterada  
        fireTableDataChanged();
    }

    public Despesa getCliente(int pos) {
        if (pos >= produtos.size()) {
            return null;
        }

        return produtos.get(pos);
    }
}

Minha classe Dao parte de Exclusão

public void deleteTabela(Despesa p) {
        try {
            PreparedStatement stm = this.con.prepareStatement("DELETE FROM table_despesa WHERE codigo = ?");
            stm.setInt(1, p.getCodigo());
            stm.executeUpdate();
            stm.close();
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex.getLocalizedMessage(), "Delete Error", JOptionPane.ERROR_MESSAGE);
        }

    }

e por fim exclusão pela linha da tabela:

private void btnDeletarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDeletarActionPerformed
// TODO add your handling code here:
    if(jTable1.getSelectedRow() >= 0){
        int confirma = JOptionPane.showConfirmDialog(null, "Deseja realmente remover ?","Aviso", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
        if(confirma == 0){
            int row = jTable1.getSelectedRow();
            Produtos p = dtm.getProduto(row);           
            new DespesaDap().delete(p);
            dtm.removeRow(row);
        }
    }else{
        JOptionPane.showMessageDialog(null, "Selecione a linha q deseja remover","Remover",JOptionPane.WARNING_MESSAGE);
    }

Bom estou apanhando bastante para terminar o meu sistema mas eu acho se você conseguir adaptar este código com certeza vai chegar ao resultado desejado.

Espero ter ajudado!!!

Criado 23 de março de 2012
Ultima resposta 24 de mar. de 2012
Respostas 18
Participantes 4