Olá galera…
To precisando da ajuda de vcs aqui novamente pessoal!!!
Bom é o seguinte…
Tenho uma JTable que está sendo modelada por uma tableModel…
Ela está buscando os dados do banco… .tá tudo ok…funcionando que é uma beleza…
Mas tenho um botão de incluir e abre uma outra tela onde o usuário digita um produto…
Gostaria que ao clicar em incluir ele gravasse o novo registro no Banco e também atualizasse minha JTable sem ser necessário eu criar um novo objeto!!
Mas não sei como… vi sobre o fireTableDataChanged() mas não consegui êxito!!
Se alguém puder me ajudar!!!
Abraços a todos!!
Atualizar JTable!
7 Respostas
Olá galera…
só lembrando que minha tabela está em outra tela!!!
É isso que tá pegando pra mim… porque pra mecher nessa tabela tenho que criar um outro objeto dessa tela pra poder manipular essa tabela…mas ae já criei um novo objeto e a table não é atualizada e sim criada novamente…
Me ajuuuuuuudem
Voce pode aou adicionar umlistener na tela onde é realizada a operação de salvar e quando ocorre este evento vc realiza novamente a consulta no banco, ou coloca sua tabela pra ser atualizada por uma Thread secundaria onde fica infinitamente com algum laço de repetição verificando o banco ou com algum tempo de 5 em 5 segundos.
Fica a seu criterio escolher, mas acredito que o listener seria a melhor olução ate mesmo por questao deperformace e demasiadas consultas no banco.
At…
Eu estava com um problema parecido com o seu, e o que eu fiz foi atualizar o TableModel toda vez que um registro era incluído no banco, da seguinte forma:
- Eu criei um método que retornava um TableModel chamado atualizarTabela:
public DefaultTableModel atualizarTabela()
{
//Array de String contendo os nomes das colunas
String[] col = new String []{"Código","Produto"};
String[][] row = new String [][] {
{"",""}
};
//Criando um modelo para uma tabela sem registro com as colunas e linhas declaradas anteriormente
DefaultTableModel modeloPadrao = new DefaultTableModel(row, col);
try
{
//Buscando a os dados da tebela no banco e adicionando em vetores
rs = this.stm.executeQuery("SELECT * FROM Produto");
Vector dados = new Vector();
Vector colunas = new Vector();
colunas.add("Código");
colunas.add("Produto");
while (rs.next())
{
Vector linhaDaTabela = new Vector();
linhaDaTabela.add(rs.getString("codigo"));
linhaDaTabela.add(rs.getString("produto"));
dados.add(linhaDaTabela);
}
//Criando o modelo já com os dados atualizados do banco
DefaultTableModel modelo = new DefaultTableModel(dados, colunas);
rs.close(); //fechando o resultset
return modelo;
}
catch (SQLException e)
{
e.printStackTrace();
}
return modeloPadrao;
}
- Depois é só chamar este método na declaração do método setModel da JTable, e colocá-lo no evento do botão incluir, assim toda vez que for inserido um novo registro no banco este método irá atualizar o TableModel da JTable buscando todos os dados salvos no banco, desta forma não há necessidade de criar um novo objeto da JTable.
Espero ter ajudado!
Vlw!
Desculpe-me mas acredito que teria algumas conciderações a fazer:
- Não utilize Vector;
- Não Utilize DefaultTableModel, cria a sua propria pois assim terá um controle melhor sobre os dados e estes nao serão duplicadados.
- A ideia do listener era mais ou menos essa que o amigo Luciano Matheus falou, mas vc poderia coloca-lo como listeners em todas as operações que pudessem refletir na sua tabela, inserção, exclusão, atualização, e demais…
Alguns TableModel que trabalha de forma simples com os dados,baseando-se em uma lista de objetos passado pra ela:
Veja com é feito voce pode utilizar ou criar sua propria.
Att…
Passe como parâmetro para sua tela onde vc inclui o novo produto, o TableModel da sua JTable. Ao salvar, se for bem sucedida a operação, vc insere o novo produto no table mode. No table model, no método que adiciona um novo registro, logo após colocá-lo no list de objetos, chame o fireTableDataChanged() que aí sim na tua table, na outra tela irá ser atualizada.
Fernando Rosa
Olá amigos!!!
Primeiramente uito obrigado pela ajuda amigos do GUJ!!!
Bom… Amigo Luciano Matheus… eu tenho métodos que são quase idênticos a esse que me falou… só que dividi em 3 partes… o código:
public String[][] dadosCliente(Vector<GrupoDeProduto> vetor){
int tam=0;
tam = vetor.size();
String[][] dGrupoDeProduto = new String[tam][2];
for(int z=0;z < tam;z++){
dGrupoDeProduto[z][0] = String.valueOf(vetor.get(z).getxGruCod());
dGrupoDeProduto[z][1] = vetor.get(z).getxGruNome();
}//fim do for
return dGrupoDeProduto;
} //fim do dadosUsuarios
//dadosEmVetor
public Vector<GrupoDeProduto> dadosEmVetor(){
DAOFactory df=DAOFactory.getDAOFactory(DAOFactory.POSTGRES);
DAOGrupoDeProduto dao = df.getDAOGrupoDeProduto();
dao.resultDados();
vetor = new Vector<GrupoDeProduto>(30,10);
try{
String resultDados[][] = dao.getDados();
int tam = resultDados.length;
for (int i=0; i<tam; i++){
String codigo = resultDados[i][0];
String nome = resultDados[i][1];
GrupoDeProduto grupoDeProduto = new GrupoDeProduto();
grupoDeProduto.setxGruCod(Integer.parseInt(codigo));
grupoDeProduto.setxGruNome(nome);
vetor.add(grupoDeProduto);
}//fim do for
}//fim do try
catch(Exception e){
JOptionPane.showMessageDialog(null,"Erro durante a gravação dos dados no vetor :"+e,"ERRO",JOptionPane.ERROR_MESSAGE);
}
return vetor;
}//fim do método dadosEmVetor
public DefaultTableModel getTableModelConsulta(){
dadosEmVetor();
String dVendedor[][] = dadosCliente(dadosEmVetor());
tabelaModel = new DefaultTableModel(dVendedor,campos);
return tabelaModel;
}
Eu tentei fazer o que o amigo falou e coloquei uma chamada ao método getTableModelConsulta dentro do botão de incluir para ele poder tentar atualizar a tabela… mas não consegui êxito 
Esse método getTableModelConsulta está setando minha tableModel…
Mas não sei o porque não está funcionando!!
Estive pesquisando e achei alguns amigos dizendo que eu teria que “fala” que ela estaria sendo mudada… mais ou menos assim…
Ao amigo 71C4700…
O qyue me aconselha a usar no lugar do vector amigo???
Tem algum material que vc possa me passar pra eu dar uma olhada???
Já estou estudando aqueles 2 links que me passaste!!!
Ao amigo Fernando Generoso…Como utilizo esse método fireTableDataChanged()???
E não entendi muito bem como devo proceder… poderia me falar mais sobre como vc explicou?
Desde já muito obrigado a todos os amigos…
Abraçosss
O que posso fazer amigo para poder atualizar essa table???
primeiro: implemente um TableModel específico para você, que extende a classe AbstractTableModel.
Nessa classe, crie métodos para adicionar objetos na tua lista de dados. Um exemplo de TableModel:
public class CondicaoPagamentoTableModel extends AbstractTableModel {
/**
*
*/
private static final long serialVersionUID = 1L;
private List<CondicaoPagamento> items = new ArrayList<CondicaoPagamento>();
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0:
return Integer.class;
case 1:
return String.class;
case 2:
return String.class;
default:
return String.class;
}
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "Código";
case 1:
return "Nome";
case 2:
return "Descrição";
default:
return "";
}
}
public List<CondicaoPagamento> getItems() {
return this.items;
}
public CondicaoPagamento getItem(int row) {
return items.get(row);
}
public void removeItem(CondicaoPagamento condicaoPagamento) {
this.items.remove(condicaoPagamento);
this.fireTableDataChanged();
}
public void removeAllElements() {
this.items.clear();
this.fireTableDataChanged();
}
public void setItems(List<CondicaoPagamento> items) {
this.items = items;
this.fireTableDataChanged();
}
public void addItem(CondicaoPagamento condicaoPagamento) {
this.items.add(condicaoPagamento);
this.fireTableDataChanged();
}
public int getColumnCount() {
return 3;
}
public int getRowCount() {
return items.size();
}
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
return items.get(rowIndex).getCodigoCondicaoPagamento();
case 1:
return items.get(rowIndex).getNomeCondicaoPagamento();
case 2:
return items.get(rowIndex).getDescricaoCondicaoPagamento();
default:
return "";
}
}
}
Ao criar a JTable, tu instancia o teu tableModel e passa no construtor da JTable.
Ao clicar o botão que que abre o outro form, no construtor desse form tu passa esse model, da tua JTable para a nova tela.
Ao salvar o objeto, depois da confirmação que foi salvo no banco, tu pega esse objeto e adiciona no table.
Como tu pode ver no meu exemplo, nessa parte:
public void addItem(CondicaoPagamento condicaoPagamento) {
this.items.add(condicaoPagamento);
this.fireTableDataChanged();
}
eu tenho um método que me adiciona um item, e logo depois, o model se atualiza, avizando pra tabela que ocorreu uma mudança na lista de items.
Espero ter ajudado, e de uma estudada em TableModel.
Fernando