Dúvida - evento em JTable - AbstractTableModel

6 respostas
jorgefrancisco

Olá pessoal…

Faz algum tempo que trabalho no desenvolvimento de uma aplicação que utiliza JTable, porém nunca consegui entender algumas coisas… o que tenho mais dúvida é o seguinte:

Quando mudo algum valor na jtable manualmente, a mesma gera um evento, porém quando mudo algum valor através do model.setValueAt() não gera evento algum… alguém saberia me explicar porque isso acontece, e como eu faria para gerar evento através do model.setValueAt()??

Não sei se fui muito claro… qualquer dúvida perguntem aí!

Obrigado!

6 Respostas

jorgefrancisco

Ninguém?? =/

ViniGodoy

Primeiro de tudo. Que evento você quer que a tabela gere?

Se você quer vigiar a mudança nos dados, adicione um Listener no TableModel, não na tabela.

Outra coisa…

Você não deveria estar usando o método setValueAt para atualizar o seu TableModel.

O ideal é, quando você criar o seu TableModel, filho de AbstractTableModel, criar um método setValue mais conveniente, que aceite apenas um índice e um objeto da classe que você está exibindo. Esse método sim, notifica a tabela sobre a mudança nos dados do modelo e, com essa notificação, a tabela dispara os seus eventos.

Por exemplo, se for uma tabela que exibe funcionários, você poderia implementar um método assim:

public void setValue(int row, Funcionario funcionario) { funcionarios.set(row, funcionario); fireTableRowsUpdated(row, row); }

Se você não criou o seu próprio TableModel e está usando o DefaultTableModel, sua implementação está péssima e precisa urgentemente de correções. Essa simplesmente não é a maneira correta de se usar um JTable. O DefaultTableModel foi criado para servir de exemplo no Swing e para coisas MUITÍSSIMO simples. Nesse caso, corriga imediatamente seu código criando seu TableModel. Aqui está um artigo ótimo, que descreve como fazer isso:
http://www.informit.com/articles/article.aspx?p=332278

jorgefrancisco

Olá ViniGodoy… primeiramente muito obrigado por responder o tópico:

Na minha aplicação está criado sim meu TableModel, extendendo de AbstractTableModel… eu escrevi o método
setValueAt para atribuir determinado célula de acordo com a linha e coluna passada… segue abaixo:

public void setValueAt(Object value, int row, int col){

	    Object [] linha = (Object [])getData().get(row);

	    if (value == null){
	    	value = new Float(0);
	    }
	    // Altera o conteudo no indice da coluna passado
	    linha[col] = value;
	    // dispara o evento de celula alterada
	    fireTableCellUpdated(row,col);
	}

Porém o q acontece e o seguinte… se na minha implementação eu chamo o método acima, ele atribui normalmente o valor passado, porém não gera evento…

Exemplo: Se eu mudo manualmente determinado valor de uma célula, alguns valores da linha são alterados automaticamente (estilo formulas de excel), porém se eu mudo através do setValueAt os valores da linha não são alterados…

Resumindo: eu gostaria de gerar com o setValueAt o mesmo evento que eu gero quando mudo os valores manualmente… isso é possível?

Abraços e obrigado!

ViniGodoy

É como eu falei… então, escute os eventos do seu tableModel, não do seu table.

Eles são disparados tanto quanto o model muda e avisa o table, quanto quando o table muda o model. :slight_smile:

jorgefrancisco

olá… primeiramente desculpe a demora para responder, pois estava fora todo esse tempo…

ViniGodoy… tenho mesmo que escutar eventos no tableModel? não teria uma maneira do próprio modelo avisar a JTable, e esta realizar as atividades de acordo com o evento?

Reparem que o que eu quero fazer é conceitualmente simples… Quero q o setValueAt tenha a mesma ação que uma modificação manual no jtable… certo? :wink: já tentei várias coisas aqui e até agora nada…

Muito obrigado

abraços!

ViniGodoy

Tem sim.

Você está querendo inverter o conceito.
A Table reage aos eventos da interface gráfica. Cliques de mouse, mudanças do teclado, redimensionamento, alteração das colunas, etc. Ela é a camada de view, e está programa para regir a mudanças de layout.

Quam reage a mudança de dados é o model. Ele sim, está preocupado com mudanças de valores.

Ele notifica a table através de eventos, que são a parte “Controller”. Reconhece o paradigma? Sim, Swing também é MVC.

Criado 24 de fevereiro de 2008
Ultima resposta 7 de mar. de 2008
Respostas 6
Participantes 2