Problemas no jtable

15 respostas
carlosalbertosales

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.

15 Respostas

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.

julianolandim

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:

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.

carlosalbertosales

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.

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.

carlosalbertosales

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.

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

julianolandim

carlosalbertosales:
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.

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.

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

carlosalbertosales
julianolandim:
carlosalbertosales:
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.

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.

é 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.
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.
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);
    }
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á.
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.

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 ver que fica ate melhor.

carlosalbertosales

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.

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

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.

carlosalbertosales

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.


Oi , e qual a diferença usando o tabela.addMouseListener(new MouseListener() { // <— use MouseAdapter aqui

carlosalbertosales

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.


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

A

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

ViniGodoy

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

Criado 21 de fevereiro de 2012
Ultima resposta 21 de fev. de 2012
Respostas 15
Participantes 5