Como Atualizar Dados de uma Jtable?

37 respostas
A

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
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);
	}
Esse é o método que vai no Banco de Dados
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();

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

37 Respostas

V

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?

M

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.

A

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!!

V

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!!

Sim, pode postar as dúvidas. A gente ajuda a fazer.

A

ViniGodoy, to muito perdido com esse AbstractTableModel, tem como vc mostar um exemplo de uma TableModel utilizando minha classe Contato???

V

Sim, posta o código da classe contato.

A
ta ai....
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;   
    }   
  
  
  
  
}
V

Ok. E que colunas vc quer que a tabela mostre?

A

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;

M

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.

A

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

A

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.


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??

M

E vamos precisar fazer isso rápido! A começar pela assinatura…

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…

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.

V

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.

V

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.

M

E vamos precisar fazer isso rápido! A começar pela assinatura…

É, 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.

A

certo…mas agora como eu faço para listar,atualizar e deletar, utilizando minhaTableModel??

V

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

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

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

A

Com a JtableModel da pra mim utiliar meus métodos DAO??

M

Voce pode, mas não devia.

O papel do TableModel é dizer como os dados serão mostrados na JTable. Não sendo de sua responsabilidade buscar os dados em algum lugar.

Voce pode realizar em ações de botões algo com os objetos que resgatou da tabela.

A

Mano ferro, eu sou apaixonado por DAO

M

Ele não disse para não usar DAO. Ele disse que a responsabilidade de consultar o DAO não é do TableModel e sim do controller.

M

Ele não disse para não usar DAO. Ele disse que a responsabilidade de consultar o DAO não é do TableModel e sim do controller.
Exato.

Seu DAO deve retornar um List para a TableModel usar.
E em algum momento voce pode chamar alguma ação do seu DAO (como alterar e deletar) usando os objetos do TableModel.

M

Veja isso:

A view é sua JTable. O model, obviamente, é o seu TableModel.

Agora veja uma das responsabilidades do controller:

“Maps user actions to model updates”

Ou seja, caso o usuário clique no botão “Excluir”, por exemplo, o controller fará a atualização no banco e no modelo.

A

nao tem como eu utilizar TableModel com o visual Editor do NetBens, por que java nao permite herança multipla… :frowning:

V

E onde teria herança múltipla? :shock:

M

Se voce esta tentando fazer.

public class MeuFrame extends JFrame, AbstractTableModel{

Voce esta pelo caminho errado.

Crie uma classe separada para isso e use a instancia da classe para fazer o que precisa.

A

Nao entendi…

A

Nao tem como eu fazer 2 extends nao gente…anemm

V

Onde vc está tentando fazer 2 extends? Não precisa disso!

A

é o seguinte, no netbeans, quando vc cria uma classe utilizando o visual editor vc estede JFrame, ai como que vou estender AbstractTableModel para minha classe, sendo que ela pescisaserestanciada??? e utracoisa, quando vc clica numa JTable arrasta, o netbens cria sua tablecomo DefacultTableModel, e o código dela nao é editável…

V

O seu tablemodel é outra classe. Totalmente diferente do seu JFrame. É mais ou menos como vc fez para criar a classe DAO. Completamente separado.
Seu JFrame não será um tablemodel, por isso, ele não precisa dar extends no TableModel.

Não sei exatamente como altera o TableModel no Netbeans. Mas deve ter uma propriedade aí onde ele deixa você editar isso. Alguém com mais experiência em netbeans pode ajudar?

A

Cmo faz pra editar em outra ferramente?

A

to tentando estanciar a classe ContatoTableModel e está dando esse erro aqui.: cannot find symbol
symbol: class ContatoTableModel
location: class Apresentação.TesteModel

V

Você deu import na classe?

D

Ser vc esta utilizando o editor do netbeans

va até o construtor do frame insira o seguinte código

SeuTableModel m=new SeuTableModel(ArrayList);//ArrayList é aquele onde estão seus dados jTableContato.setModel(m);

Criado 9 de março de 2010
Ultima resposta 3 de mai. de 2013
Respostas 37
Participantes 5