Boa noite galera, to desenvolvendo uma aplicação aqui utilizando Visual Editor e JTable, agora eu to sem saber uma coisa, como eu faço para que ao usuario selecionar uma linha da JTable e esses dados serem capiturados e jogados para outra tela para que eles possam ser atualizados utilizando meu método de atualizar que tenho feito aqui na aplicação???
estou utilizando o DefaultTableModel…
Vo postar os método…
Esse é o método de alterar
[code]public void alterarContato(int idusuario,String nome,String idade,String telefone) throws SQLException{
Contato cont = new Contato(nome,idade,telefone);
cont.setIdusuario(idusuario);
contatoDAO cDAO = new contatoDAO();
cDAO.altera(cont);
}[/code]
Esse é o método que vai no Banco de Dados
[code]public void altera(Contato contato) throws SQLException{
Connection conn = Conexao.getConexao();
String sql = " Update usuario set nome = ? ,idade = ? ,telefone = ? where idusuario = ? ";
PreparedStatement stmt = conn.prepareStatement(sql);
// Setar os valores no statemant
stmt.setString(1, contato.getNome());
stmt.setString(2, contato.getIdade());
stmt.setString(3, contato.getTelefone());
stmt.setInt(4,contato.getIdusuario());
// Executa o código SQL com os valores setados
stmt.execute();
stmt.close();
}[/code]
OBS…(O CAMPO IDUSUARIO ELE NAO É ALTERADO, É SÓ COMO REFERENCIA PARA VER QUAL É A TUPLA QUE SERA ALTERADA, POR QUE ELE ESTÁ COMO ALTOINCREMENTO NO BANCO DE DADOS!!!)
Você começa parando de usar o DefaultTableModel, e fazendo seu próprio model:
http://www.guj.com.br/posts/list/132698.java#714736
Então você usa o método get() do seu TableModel para pegar diretamente o contato alterado, e joga esse contato no DAO.
Acho que já é a terceira vez que te ensino isso… porque ainda está usando o DefaultTableModel???
Gosta de sofrer? Tem alguma queda por sado-masoquismo? Ou é preguiça de aprender a fazer do jeito certo (e fácil) mesmo?
Vamos ter que criar um movimento, “Não use DefaultTableModel” pra esse povo entender.
Cara, aprender a fazer um TableModel além de ser um resultado melhor voce vai entender a resolver problemas simples como esse que voce esta passando.
ViniGodoy e Mark_Ameba, vou tentar entender e utiizar essa tal de AbstractTableModel, de tanto vcs insistirem, caso tenha alguma dúvida vo procurar vcs falo…
Obrigado!!
[quote=Anderson S.]ViniGodoy e Mark_Ameba, vou tentar entender e utiizar essa tal de AbstractTableModel, de tanto vcs insistirem, caso tenha alguma dúvida vo procurar vcs falo…
Obrigado!![/quote]
Sim, pode postar as dúvidas. A gente ajuda a fazer.
ViniGodoy, to muito perdido com esse AbstractTableModel, tem como vc mostar um exemplo de uma TableModel utilizando minha classe Contato???
Sim, posta o código da classe contato.
ta ai…
[code]package Negocio;
public class Contato {
private int idusuario;
private String nome;
private String idade;
private String telefone;
//Contrutor utilizado para Update e delete
public Contato( int idusuario){
this.idusuario = idusuario;
}
// Contrutor padrão
public Contato(String nome , String idade , String telefone){
this.nome = nome;
this.idade = idade;
this.telefone = telefone;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getIdade() {
return idade;
}
public void setIdade(String idade) {
this.idade = idade;
}
public String getTelefone() {
return telefone;
}
public void setTelefone(String telefone) {
this.telefone = telefone;
}
public int getIdusuario() {
return idusuario;
}
public void setIdusuario(int idusuario) {
this.idusuario = idusuario;
}
} [/code]
Ok. E que colunas vc quer que a tabela mostre?
Como para deletar uma tupla(linha) e atualizar vo prescisar do idusuario, entao vou ter que mostrar todas…
private int idusuario;
private String nome;
private String idade;
private String telefone;
Usando como exemplo o TableModel que o ViniGodoy postou em: http://www.guj.com.br/posts/list/132698.java#714736
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
public class ContatoTableModel extends AbstractTableModel {
private static final int COL_NOME = 0;
private static final int COL_IDADE = 1;
private static final int COL_TELEFONE = 1;
private List<Contato> valores;
// Esse é um construtor, que recebe a nossa lista de livros
public ContatoTableModel(List<Contato> valores) {
this.valores = new ArrayList<Contato>(valores);
}
public int getRowCount() {
// Quantas linhas tem sua tabela? Uma para cada item da lista.
return valores.size();
}
public int getColumnCount() {
// Quantas colunas tem a tabela? Nesse exemplo, só 2.
return 2;
}
public String getColumnName(int columnIdx) {
// Qual é o nome das nossas colunas?
if (columnIdx == COL_NOME)
return "Nome";
if (columnIdx == COL_IDADE)
return "Idade";
if (columnIdx == COL_TELEFONE)
return "Tel.";
return ""; // Nunca deve ocorrer
}
public Object getValueAt(int row, int column) {
// Precisamos retornar o valor da coluna column e da linha row.
Contato con = valores.get(row);
if (column == COL_NOME)
return con.getNome();
if (column == COL_IDADE)
return con.getIdade();
if (column == COL_TELEFONE)
return con.getTelefone();
return ""; // Nunca deve ocorrer
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
// Vamos alterar o valor da coluna columnIndex na linha rowIndex com o
// valor aValue passado no parâmetro.
// Note que vc poderia alterar 2 campos ao invés de um só.
Contato con = valores.get(rowIndex);
if (columnIndex == COL_NOME)
con.setNome(aValue.toString());
if (columnIndex == COL_IDADE)
con.setIdade(aValue.toString());
if (columnIndex == COL_TELEFONE)
con.setTelefone(aValue.toString());
}
public Class<?> getColumnClass(int columnIndex) {
// Qual a classe das nossas colunas? Como estamos exibindo texto, é
// string.
return String.class;
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
// Indicamos se a célula da rowIndex e da columnIndex é editável. Nossa
// tabela toda é.
return true;
}
// Já que esse tableModel é de contatos, vamos fazer um get que retorne um
// contato inteiro.
// Isso elimina a necessidade de chamar o getValueAt() nas telas.
public Contato get(int row) {
return valores.get(row);
}
}
Repare que passando uma List ele vai exibir os dados de Nome, Idade e Telefone.
E um get(int rowIdx) retorna um Contato dessa lista que quando voce populou deve conter o id também.
depois vc me fala como eu faço para , listar os dados do Banco de dados na JTable utilizando minha TableModel, deletar e Atualizar, por que estou perdido em AbstracTableModel…
vlw
[quote=Mark_Ameba]Usando como exemplo o TableModel que o ViniGodoy postou em: http://www.guj.com.br/posts/list/132698.java#714736
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
public class ContatoTableModel extends AbstractTableModel {
private static final int COL_NOME = 0;
private static final int COL_IDADE = 1;
private static final int COL_TELEFONE = 1;
private List<Contato> valores;
// Esse é um construtor, que recebe a nossa lista de livros
public ContatoTableModel(List<Contato> valores) {
this.valores = new ArrayList<Contato>(valores);
}
public int getRowCount() {
// Quantas linhas tem sua tabela? Uma para cada item da lista.
return valores.size();
}
public int getColumnCount() {
// Quantas colunas tem a tabela? Nesse exemplo, só 2.
return 2;
}
public String getColumnName(int columnIdx) {
// Qual é o nome das nossas colunas?
if (columnIdx == COL_NOME)
return "Nome";
if (columnIdx == COL_IDADE)
return "Idade";
if (columnIdx == COL_TELEFONE)
return "Tel.";
return ""; // Nunca deve ocorrer
}
public Object getValueAt(int row, int column) {
// Precisamos retornar o valor da coluna column e da linha row.
Contato con = valores.get(row);
if (column == COL_NOME)
return con.getNome();
if (column == COL_IDADE)
return con.getIdade();
if (column == COL_TELEFONE)
return con.getTelefone();
return ""; // Nunca deve ocorrer
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
// Vamos alterar o valor da coluna columnIndex na linha rowIndex com o
// valor aValue passado no parâmetro.
// Note que vc poderia alterar 2 campos ao invés de um só.
Contato con = valores.get(rowIndex);
if (columnIndex == COL_NOME)
con.setNome(aValue.toString());
if (columnIndex == COL_IDADE)
con.setIdade(aValue.toString());
if (columnIndex == COL_TELEFONE)
con.setTelefone(aValue.toString());
}
public Class<?> getColumnClass(int columnIndex) {
// Qual a classe das nossas colunas? Como estamos exibindo texto, é
// string.
return String.class;
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
// Indicamos se a célula da rowIndex e da columnIndex é editável. Nossa
// tabela toda é.
return true;
}
// Já que esse tableModel é de contatos, vamos fazer um get que retorne um
// contato inteiro.
// Isso elimina a necessidade de chamar o getValueAt() nas telas.
public Contato get(int row) {
return valores.get(row);
}
}
Repare que passando uma List ele vai exibir os dados de Nome, Idade e Telefone.
E um get(int rowIdx) retorna um Contato dessa lista que quando voce populou deve conter o id também.[/quote]
Vle amigo, mas popr motivos de deletar tuplas e atualizar tuplas, eu tenho que mostrar na JTalbe o campo idusuario…tem como vc remandar ai como le incluso??
E vamos precisar fazer isso rápido! A começar pela assinatura…
[quote=Anderson S.]depois vc me fala como eu faço para , listar os dados do Banco de dados na JTable utilizando minha TableModel, deletar e Atualizar, por que estou perdido em AbstracTableModel…
[/quote]
Então invista tempo estudando isso. É mais fácil do que parece, mas se fizermos para você, você não aprende. Dica: os objetos resgatados do banco podem ser passados via argumento do construtor.
Vide o comentário acima. Quando você aprender a usar AbstractTableModel verá como incluir/remover colunas da sua tabela é uma tarefa trivial.
Você não precisa exibir. Dentro do seu próprio TableModel estará a informação completa do contato. Mas o model só irá mostrar as informações que interessam para o usuário, e ele dificilmente vai querer ver o ID.
Entretanto, o seu método de excluir irá conseguir pegar uma informação de contato completa, com id e tudo mais, já que o modelo trabalha diretamente com a classe pronta.
Antes de tudo.
Tente entender o que é o TableModel. E porque ele foi programado daquele jeito.
Obviamente, se você só copiar e colar os códigos, não vai nem saber modificar e nem usar o TableModel.
O que você tem que entender é que o model é uma classe que diz para a tabela que dados da lista de Contatos ela deve exibir. Quem chama os métodos do TableModel (getValueAt, isEditable, etc) é a tabela.
Você então cria métodos para que o model manipule sua lista. Coisas como adicionar um novo contato na lista e informar a tabela que isso aconteceu. Note que o model pode ter uma lista completa, cheia de contatos, mas decidir só dizer para a tabela que os campos “nome” e “telefone” serão exibidos.
E vamos precisar fazer isso rápido! A começar pela assinatura…
[/quote]
É, e achei seu link mais interessante que o da minha, vou mudar também.
E sobre o tópico.
Acredito que em algum momento voce carregue os dados do banco e os transforme em um List não?
Com cada objeto da lista tendo um Contato com id,nome,idade e telefone.
O TableModel que mostrei mostra apenas algunas dados para voce reparar que quando fazer get(int row) voce tera o objeto ja com id, sem necessariamente mostra-lo. Mas é uma opção sua. Estude um pouco o código e vera como fazer isso.
certo…mas agora como eu faço para listar,atualizar e deletar, utilizando minhaTableModel??
Ok. Agora para obter o contato selecionado na sua tabela, você pode simplesmente fazer:
Note que isso retornou para você a informação do contato completa, não só o que foi listado na tela.
Aí, basta chamar as suas classes de DAO correspondentes.
Por exemplo, um método para abrir o contato selecionado numa outra janela poderia ser:
public void abrirContato() {
Contato selecionado = meuModel.get(minhaTabela.getSelectedRow());
EditarContatoDialog ed = new EditarContatoDialog(contato);
ed.setVisible(true);
}
1°
ContatoTableModel model = new ContatoTableModel(listDeContatos);
jTable.setModel(model);
Altere o TableModel e entenda como ele funciona. Talvez voce vai descobrir isso sozinho.