Como Atualizar Dados de uma Jtable?

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);
}

ContatoTableModel model = new ContatoTableModel(listDeContatos);
jTable.setModel(model);

Altere o TableModel e entenda como ele funciona. Talvez voce vai descobrir isso sozinho.