Problemas no jtable

Olá pessoal, gostaria humildemente pedir ajudas.
To fazendo um cadastro de clientes e estou com problemas no meu Jtable, o caso é o seguinte:
Consigo buscar e montar a tabela tudo certo, mas quando vou deletar um item da tabela ela não me obedece mais.
veja o código abaixo:

package View;

import Dao.ClienteDao;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.event.*;
import java.awt.*;




import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import modelo.Cliente;

public class tabelaClientes extends JFrame {

    private JTable tabela;
    private DefaultTableModel tabelaModelo;

    public tabelaClientes() {
        super("Tabela de Clientes");
        String[] col = {"Codigo ", "Nome Cliente ", "Telefone", "Celular"};
        tabelaModelo = new DefaultTableModel(col, 0);
        tabela = new JTable(tabelaModelo) {

            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };
        criaJtable();

        tabela.addMouseListener(new MouseListener() {

            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 2) {
                    int linha = tabela.getSelectedRow();
                    int coluna = tabela.getSelectedColumn();
                    System.out.println("o codigo da linha é " + linha + " o código da coluna é : " + coluna);
                    removeItens(linha);
                }


            }

            public void mousePressed(MouseEvent e) {
            }

            public void mouseReleased(MouseEvent e) {
            }

            public void mouseEntered(MouseEvent e) {
            }

            public void mouseExited(MouseEvent e) {
            }
        });
        setSize(700, 600);
        setLocationRelativeTo(null);
    }

    private void criaJtable() {
        ClienteDao cli = new ClienteDao();
        List clientes = cli.buscarTodos();
        for (Object c : clientes) {
            Cliente cl = (Cliente) c;
            tabelaModelo.addRow(new Object[]{cl.getId(), cl.getNome(), cl.getTelefone(), cl.getCelular()});
        }
        JScrollPane pane = new JScrollPane(tabela, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        getContentPane().add(pane, BorderLayout.CENTER);
        getContentPane().add(new JLabel("Tabela de Clientes"), BorderLayout.NORTH);
        setVisible(
                true);
    }

    public void removeItens(int linha) {
        System.out.println("Ta removendo o item da linha" + linha);
        ((DefaultTableModel) tabela.getModel()).removeRow(linha);
        criaJtable();

    }

    public static void main(String[] args) {
        tabelaClientes tb = new tabelaClientes();
        tb.setVisible(true);
    }
}

se eu coloquei esse assunto em um lugar inadequado desculpe o meu amadorismo aqui. mas peço ajuda.

Bom dia carlos, eu creio que vc esta cometendo o seguinte erro, vc esta deletando a linha mas nao esta deletando o cliente no seu banco de dados, ou seja vc deleta a linha e chama novamente o metodo criajtable e esse metodo busca novamente todos os clientes e joga na sua jtable.
Entao para resolver remova ele do seu banco de dados ai sim vc chama o seu metodo para criar a jtable.

Abraço, descupe se tiver erros de digitação mas é que respondi pelo celular.

Esqueci de te dizer, quando vc for postar um codigo use sempre a tag code, assim facilitara muito para podermos interpretarmos o codigo.
Abraço e boa sorte :thumbup:

carlosalbertosales, evite usar DefaultTableModel, crie seu proprio model, estendendo o objeto AbstractTableModel, pesquise sobre o assunto inclusivel aqui mesmo no guj, vc verá como ficará mais facil, e melhor de dá manutenções.

Boa sorte.

[quote=julianolandim]Bom dia carlos, eu creio que vc esta cometendo o seguinte erro, vc esta deletando a linha mas nao esta deletando o cliente no seu banco de dados, ou seja vc deleta a linha e chama novamente o metodo criajtable e esse metodo busca novamente todos os clientes e joga na sua jtable.
Entao para resolver remova ele do seu banco de dados ai sim vc chama o seu metodo para criar a jtable.

Abraço, descupe se tiver erros de digitação mas é que respondi pelo celular.
[/quote]

Agradeço a ajuda, coloquei o código que vai excluir no banco de dados, agora exclui na jtable e no banco, veja o código

    public void removeItens(int linha) {
        ClienteDao cd = new ClienteDao();
        int cod = (Integer) tabelaModelo.getValueAt(tabela.getSelectedRow(), 0);
        cd.excluir(cod);
        System.out.println("excluiu!" + cod);
        ((DefaultTableModel) tabela.getModel()).removeRow(linha);
        criaJtable();
    }

mas agora quando eu chamo o criarJtable(); ele traz duplicado tudo que tem ao invez de apagar a tabela ele traz duplicado.

[quote=Fexx]carlosalbertosales, evite usar DefaultTableModel, crie seu proprio model, estendendo o objeto AbstractTableModel, pesquise sobre o assunto inclusivel aqui mesmo no guj, vc verá como ficará mais facil, e melhor de dá manutenções.

Boa sorte. [/quote]

Amigo obrigado pela resposta, vou pesquisar como criar meu próprio model.
Abraços.

[quote=carlosalbertosales][quote=julianolandim]Bom dia carlos, eu creio que vc esta cometendo o seguinte erro, vc esta deletando a linha mas nao esta deletando o cliente no seu banco de dados, ou seja vc deleta a linha e chama novamente o metodo criajtable e esse metodo busca novamente todos os clientes e joga na sua jtable.
Entao para resolver remova ele do seu banco de dados ai sim vc chama o seu metodo para criar a jtable.

Abraço, descupe se tiver erros de digitação mas é que respondi pelo celular.
[/quote]

Agradeço a ajuda, coloquei o código que vai excluir no banco de dados, agora exclui na jtable e no banco, veja o código

    public void removeItens(int linha) {
        ClienteDao cd = new ClienteDao();
        int cod = (Integer) tabelaModelo.getValueAt(tabela.getSelectedRow(), 0);
        cd.excluir(cod);
        System.out.println("excluiu!" + cod);
        ((DefaultTableModel) tabela.getModel()).removeRow(linha);
        criaJtable();
    }

mas agora quando eu chamo o criarJtable(); ele traz duplicado tudo que tem ao invez de apagar a tabela ele traz duplicado.
[/quote]

é porque eu esqueci de te dizer que você tem que limpar a JTable, copie o metodo que fiz para a sua classe e chame ele no começo do seu metodo criaJtable()

    public void limpaTabela(JTable tabela,DefaultTableModel modelo){
       while (tabela.getRowCount() > 0) {
            modelo.removeRow(0);
       }   
    }

altere o seu metodo

private void criaJtable() { 
        limpaTabela(tabela,tabelaModelo) // coloque o metodo aqui para limpar toda vez que vc chamar o metodo 
        ClienteDao cli = new ClienteDao();  
        List clientes = cli.buscarTodos();  
        for (Object c : clientes) {  
            Cliente cl = (Cliente) c;  
            tabelaModelo.addRow(new Object[]{cl.getId(), cl.getNome(), cl.getTelefone(), cl.getCelular()});  
        }  
        JScrollPane pane = new JScrollPane(tabela, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);  
        getContentPane().add(pane, BorderLayout.CENTER);  
        getContentPane().add(new JLabel("Tabela de Clientes"), BorderLayout.NORTH);  
        setVisible(  
                true);  
    }  

Qualquer duvida me avise.

[quote=julianolandim][quote=carlosalbertosales][quote=julianolandim]Bom dia carlos, eu creio que vc esta cometendo o seguinte erro, vc esta deletando a linha mas nao esta deletando o cliente no seu banco de dados, ou seja vc deleta a linha e chama novamente o metodo criajtable e esse metodo busca novamente todos os clientes e joga na sua jtable.
Entao para resolver remova ele do seu banco de dados ai sim vc chama o seu metodo para criar a jtable.

Abraço, descupe se tiver erros de digitação mas é que respondi pelo celular.
[/quote]

Agradeço a ajuda, coloquei o código que vai excluir no banco de dados, agora exclui na jtable e no banco, veja o código

    public void removeItens(int linha) {
        ClienteDao cd = new ClienteDao();
        int cod = (Integer) tabelaModelo.getValueAt(tabela.getSelectedRow(), 0);
        cd.excluir(cod);
        System.out.println("excluiu!" + cod);
        ((DefaultTableModel) tabela.getModel()).removeRow(linha);
        criaJtable();
    }

mas agora quando eu chamo o criarJtable(); ele traz duplicado tudo que tem ao invez de apagar a tabela ele traz duplicado.
[/quote]

é porque eu esqueci de te dizer que você tem que limpar a JTable, copie o metodo que fiz para a sua classe e chame ele no começo do seu metodo criaJtable()

    public void limpaTabela(JTable tabela,DefaultTableModel modelo){
       while (tabela.getRowCount() > 0) {
            modelo.removeRow(0);
       }   
    }

altere o seu metodo

private void criaJtable() { 
        limpaTabela(tabela,tabelaModelo) // coloque o metodo aqui para limpar toda vez que vc chamar o metodo 
        ClienteDao cli = new ClienteDao();  
        List clientes = cli.buscarTodos();  
        for (Object c : clientes) {  
            Cliente cl = (Cliente) c;  
            tabelaModelo.addRow(new Object[]{cl.getId(), cl.getNome(), cl.getTelefone(), cl.getCelular()});  
        }  
        JScrollPane pane = new JScrollPane(tabela, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);  
        getContentPane().add(pane, BorderLayout.CENTER);  
        getContentPane().add(new JLabel("Tabela de Clientes"), BorderLayout.NORTH);  
        setVisible(  
                true);  
    }  

Qualquer duvida me avise.[/quote]

fantástico, funcionou, mas sempre tem um mas…
o problema agora é que não entra denovo no :

 tabela.addMouseListener(new MouseListener() {

            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 2) {
                    int linha = tabela.getSelectedRow();
                    int coluna = tabela.getSelectedColumn();
                    System.out.println("o codigo da linha é " + linha + " o código da coluna é : " + coluna);
                    removeItens(linha);
                }


            }

que está dentro do método construtor da tabela.

[code]
super(“Tabela de Clientes”);
String[] col = {"Codigo ", "Nome Cliente ", “Telefone”, “Celular”};
tabelaModelo = new DefaultTableModel(col, 0);
tabela = new JTable(tabelaModelo) {

        @Override
        public boolean isCellEditable(int row, int column) {
            return false;
        }
    };
    criaJtable();

    tabela.addMouseListener(new MouseListener() {

        public void mouseClicked(MouseEvent e) {
            if (e.getClickCount() == 2) {
                int linha = tabela.getSelectedRow();
                int coluna = tabela.getSelectedColumn();
                System.out.println("o codigo da linha é " + linha + " o código da coluna é : " + coluna);
                removeItens(linha);
            }


        }

        public void mousePressed(MouseEvent e) {
        }

        public void mouseReleased(MouseEvent e) {
        }

        public void mouseEntered(MouseEvent e) {
        }

        public void mouseExited(MouseEvent e) {
        }
    });
    setSize(700, 600);
    setLocationRelativeTo(null);
}[/code]

como faço para ele retornar ao evento de mouse da tabela.
o tenho de colocar ele em um outro lugar…???
Agradeço desde já.

tente fazer o seguinte, apague isso do seu codigo

       tabela.addMouseListener(new MouseListener() {   // <--- use MouseAdapter aqui
  
            public void mouseClicked(MouseEvent e) {  
                if (e.getClickCount() == 2) {  
                    int linha = tabela.getSelectedRow();  
                    int coluna = tabela.getSelectedColumn();  
                    System.out.println("o codigo da linha é " + linha + " o código da coluna é : " + coluna);  
                    removeItens(linha);  
                }  
  
  
            }  
  
            public void mousePressed(MouseEvent e) {  
            }  
  
            public void mouseReleased(MouseEvent e) {  
            }  
  
            public void mouseEntered(MouseEvent e) {  
            }  
  
            public void mouseExited(MouseEvent e) {  
            }  
        }); 

agora coloque

         tabela.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                if(evt.getClickCount()==2){
                    int linha = tabela.getSelectedRow();  
                    int coluna = tabela.getSelectedColumn();  
                    System.out.println("o codigo da linha é " + linha + " o código da coluna é : " + coluna);  
                    removeItens(linha); 
                }              
            }
        }); 

experimente fazer isso depois você me fala se deu certo.

uma outra forma que ficaria bem simples é você não chamar o metodo criaJtable no seu metodo removeItens, ja que voce ja esta removendo a linha da jtable pelo comando removeRow.
acho que assim ficaria melhor ainda.
entao…
voce remove o cliente no banco de dados depois a linha na tabela e não chame mais o metodo criaJtable();

public void removeItens(int linha) {  
    ClienteDao cd = new ClienteDao();  
    int cod = (Integer) tabelaModelo.getValueAt(tabela.getSelectedRow(), 0);  
    cd.excluir(cod);  
    System.out.println("excluiu!" + cod);  
    ((DefaultTableModel) tabela.getModel()).removeRow(linha);  
    //criaJtable();  <--- tira esse metodo dai
}  

fazendo isso vc vai ver que fica ate melhor.

[quote=julianolandim]uma outra forma que ficaria bem simples é você não chamar o metodo criaJtable no seu metodo removeItens, ja que voce ja esta removendo a linha da jtable pelo comando removeRow.
acho que assim ficaria melhor ainda.
entao…
voce remove o cliente no banco de dados depois a linha na tabela e não chame mais o metodo criaJtable();

public void removeItens(int linha) {  
    ClienteDao cd = new ClienteDao();  
    int cod = (Integer) tabelaModelo.getValueAt(tabela.getSelectedRow(), 0);  
    cd.excluir(cod);  
    System.out.println("excluiu!" + cod);  
    ((DefaultTableModel) tabela.getModel()).removeRow(linha);  
    //criaJtable();  <--- tira esse metodo dai
}  

fazendo isso vc vai vair que fica ate melhor.[/quote]

bacana, funcionou assim eu não preciso chamar o criaJtable(); no excluir linha… deu certo. abraços.

Só uma dica… vai ser muito mais trabalhoso trabalhar com o JTable se você continuar usando o DefaultTableModel.

Se quiser realmente a aprender a usar um JTable, e ter pouco estresse, aprenda a fazer seu próprio TableModel.
Vai evitar casts, duplicações de dados, carga do banco do banco de dados, além de ocupar menos memória e ser mais leve.

Além disso, leia com atenção a lista de fóruns antes de postar.
Seu tópico é de Interface Gráfica, tive que move-lo.

[quote=julianolandim]tente fazer o seguinte, apague isso do seu codigo

       tabela.addMouseListener(new MouseListener() {   // <--- use MouseAdapter aqui
  
            public void mouseClicked(MouseEvent e) {  
                if (e.getClickCount() == 2) {  
                    int linha = tabela.getSelectedRow();  
                    int coluna = tabela.getSelectedColumn();  
                    System.out.println("o codigo da linha é " + linha + " o código da coluna é : " + coluna);  
                    removeItens(linha);  
                }  
  
  
            }  
  
            public void mousePressed(MouseEvent e) {  
            }  
  
            public void mouseReleased(MouseEvent e) {  
            }  
  
            public void mouseEntered(MouseEvent e) {  
            }  
  
            public void mouseExited(MouseEvent e) {  
            }  
        }); 

agora coloque

         tabela.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                if(evt.getClickCount()==2){
                    int linha = tabela.getSelectedRow();  
                    int coluna = tabela.getSelectedColumn();  
                    System.out.println("o codigo da linha é " + linha + " o código da coluna é : " + coluna);  
                    removeItens(linha); 
                }              
            }
        }); 

experimente fazer isso depois você me fala se deu certo.[/quote]
Oi , e qual a diferença usando o tabela.addMouseListener(new MouseListener() { // <— use MouseAdapter aqui

[quote=ViniGodoy]Só uma dica… vai ser muito mais trabalhoso trabalhar com o JTable se você continuar usando o DefaultTableModel.

Se quiser realmente a aprender a usar um JTable, e ter pouco estresse, aprenda a fazer seu próprio TableModel.
Vai evitar casts, duplicações de dados, carga do banco do banco de dados, além de ocupar menos memória e ser mais leve.

Além disso, leia com atenção a lista de fóruns antes de postar.
Seu tópico é de Interface Gráfica, tive que move-lo.[/quote]
Obrigado pela dica. Estou apreendendo a postar aqui. se tiver alguma dica para que eu possa crescer nesse famoso forum me ajude.
Aliás onde eu acho materia de como construir meu próprio TableModel.
No aguardo

Aproveitando estou com um mesmo problema

link da minha duvida


http://www.guj.com.br/java/265824-pessoal-duvida-jtable

Quero muito tirar está duvida

Ao lado do link em vermelho gritante na minha assinatura, hehehe:
http://www.guj.com.br/posts/list/15/199067.java#1001295