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:
packageView;importDao.ClienteDao;importjava.util.List;importjavax.swing.JFrame;importjavax.swing.JLabel;importjava.awt.event.*;importjava.awt.*;importjavax.swing.JScrollPane;importjavax.swing.JTable;importjavax.swing.table.DefaultTableModel;importmodelo.Cliente;publicclasstabelaClientesextendsJFrame{privateJTabletabela;privateDefaultTableModeltabelaModelo;publictabelaClientes(){super("Tabela de Clientes");String[]col={"Codigo ","Nome Cliente ","Telefone","Celular"};tabelaModelo=newDefaultTableModel(col,0);tabela=newJTable(tabelaModelo){@OverridepublicbooleanisCellEditable(introw,intcolumn){returnfalse;}};criaJtable();tabela.addMouseListener(newMouseListener(){publicvoidmouseClicked(MouseEvente){if(e.getClickCount()==2){intlinha=tabela.getSelectedRow();intcoluna=tabela.getSelectedColumn();System.out.println("o codigo da linha é "+linha+" o código da coluna é : "+coluna);removeItens(linha);}}publicvoidmousePressed(MouseEvente){}publicvoidmouseReleased(MouseEvente){}publicvoidmouseEntered(MouseEvente){}publicvoidmouseExited(MouseEvente){}});setSize(700,600);setLocationRelativeTo(null);}privatevoidcriaJtable(){ClienteDaocli=newClienteDao();Listclientes=cli.buscarTodos();for(Objectc:clientes){Clientecl=(Cliente)c;tabelaModelo.addRow(newObject[]{cl.getId(),cl.getNome(),cl.getTelefone(),cl.getCelular()});}JScrollPanepane=newJScrollPane(tabela,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);getContentPane().add(pane,BorderLayout.CENTER);getContentPane().add(newJLabel("Tabela de Clientes"),BorderLayout.NORTH);setVisible(true);}publicvoidremoveItens(intlinha){System.out.println("Ta removendo o item da linha"+linha);((DefaultTableModel)tabela.getModel()).removeRow(linha);criaJtable();}publicstaticvoidmain(String[]args){tabelaClientestb=newtabelaClientes();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.
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
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
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()
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
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()
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(newMouseListener(){publicvoidmouseClicked(MouseEvente){if(e.getClickCount()==2){intlinha=tabela.getSelectedRow();intcoluna=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=newDefaultTableModel(col,0);tabela=newJTable(tabelaModelo){@OverridepublicbooleanisCellEditable(introw,intcolumn){returnfalse;}};criaJtable();tabela.addMouseListener(newMouseListener(){publicvoidmouseClicked(MouseEvente){if(e.getClickCount()==2){intlinha=tabela.getSelectedRow();intcoluna=tabela.getSelectedColumn();System.out.println("o codigo da linha é "+linha+" o código da coluna é : "+coluna);removeItens(linha);}}publicvoidmousePressed(MouseEvente){}publicvoidmouseReleased(MouseEvente){}publicvoidmouseEntered(MouseEvente){}publicvoidmouseExited(MouseEvente){}});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(newMouseListener(){// <--- use MouseAdapter aquipublicvoidmouseClicked(MouseEvente){if(e.getClickCount()==2){intlinha=tabela.getSelectedRow();intcoluna=tabela.getSelectedColumn();System.out.println("o codigo da linha é "+linha+" o código da coluna é : "+coluna);removeItens(linha);}}publicvoidmousePressed(MouseEvente){}publicvoidmouseReleased(MouseEvente){}publicvoidmouseEntered(MouseEvente){}publicvoidmouseExited(MouseEvente){}});
agora coloque
tabela.addMouseListener(newjava.awt.event.MouseAdapter(){publicvoidmouseClicked(java.awt.event.MouseEventevt){if(evt.getClickCount()==2){intlinha=tabela.getSelectedRow();intcoluna=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();
publicvoidremoveItens(intlinha){ClienteDaocd=newClienteDao();intcod=(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();
publicvoidremoveItens(intlinha){ClienteDaocd=newClienteDao();intcod=(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(newMouseListener(){// <--- use MouseAdapter aquipublicvoidmouseClicked(MouseEvente){if(e.getClickCount()==2){intlinha=tabela.getSelectedRow();intcoluna=tabela.getSelectedColumn();System.out.println("o codigo da linha é "+linha+" o código da coluna é : "+coluna);removeItens(linha);}}publicvoidmousePressed(MouseEvente){}publicvoidmouseReleased(MouseEvente){}publicvoidmouseEntered(MouseEvente){}publicvoidmouseExited(MouseEvente){}});
agora coloque
tabela.addMouseListener(newjava.awt.event.MouseAdapter(){publicvoidmouseClicked(java.awt.event.MouseEventevt){if(evt.getClickCount()==2){intlinha=tabela.getSelectedRow();intcoluna=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